博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Summer training #9
阅读量:4346 次
发布时间:2019-06-07

本文共 7312 字,大约阅读时间需要 24 分钟。

A:树形DP

给出一棵树,但是它的边是有向边,选择一个城市,问最少调整多少条边的方向能使一个选中城市可以到达所有的点,输出最小的调整的边数,和对应的点

要改变的边的权值为1,不需要改变的边的权值为0,

两次dfs 第一次算出以1点为根节点到所有点要改变的边数,第二次以1为根节点向下遍历节点   算出每一个点到达所有点要改变的边数,

dp[son]+=(dp[root]-dp[son])+((tree[i].val)?-1:1),某一点的值是他父节点的值减去他以前的值再考虑他与父节点之间的边的方向。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;int n,lne;int dp[200010];int head[200010];int city[200010];struct node{ int to,next,val;}tree[400010];void add(int a,int b){ tree[lne].to=b; tree[lne].val=0; tree[lne].next=head[a]; head[a]=lne++; tree[lne].to=a; tree[lne].val=1; tree[lne].next=head[b]; head[b]=lne++;}void dfs1(int root,int pre){ for(int i=head[root];i!=-1;i=tree[i].next) { int son=tree[i].to; if(son==pre) continue; dfs1(son,root); dp[root]+=dp[son]+tree[i].val; }}void dfs2(int root,int pre){ for(int i=head[root];i!=-1;i=tree[i].next) { int son=tree[i].to; if(son==pre) continue; dp[son]+=(dp[root]-dp[son])+((tree[i].val)?-1:1); dfs2(son,root); }}int main(){ int a,b; while(scanf("%d",&n)!=EOF) { lne=0; memset(head,-1,sizeof(head)); for(int i=0;i
View Code

B:算表面积 先把每个除了四周都加起来 然后减去四周重复的

#include 
#include
#include
#include
#define foror(i,a,b) for(i=a;i
b;i--)#define EPS 1.0e-6#define PI acos(-1.0)#define INF 3000000000#define MOD 1000000009#define mem(a,b) memset((a),b,sizeof(a))#define TS printf("!!!\n")#define lson o<<1, l, m#define rson o<<1|1, m+1, r//using ll = long long;//using ull= unsigned long long;//std::ios::sync_with_stdio(false);using namespace std;//priority_queue
,greater
> que;typedef long long ll;int a[110][110];char s[110][110];int dir[4][2];int main(){ freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);dir[0][0]=-1,dir[0][1]=0;dir[1][0]=1,dir[1][1]=0;dir[2][0]=0,dir[2][1]=1;dir[3][0]=0,dir[3][1]=-1; int n,m ; cin >> n >> m; mem(a,0); for(int i=1;i<=n;i++) { scanf("%s",s[i]+1); for(int j=1;j<=m;j++) a[i][j]=s[i][j]-'0'; } int ans=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { ans+=a[i][j]*4+2; if(a[i][j]==0) ans-=2; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { for(int w=0;w<4;w++) { int dx=i+dir[w][0]; int dy=j+dir[w][1]; ans-=min(a[i][j],a[dx][dy]); } } cout<
<
View Code

C:DFS+二进制压缩

#include 
#include
#include
#include
#define foror(i,a,b) for(i=a;i
b;i--)#define EPS 1.0e-6#define PI acos(-1.0)#define INF 3000000000#define MOD 1000000009#define mem(a,b) memset((a),b,sizeof(a))#define TS printf("!!!\n")#define lson o<<1, l, m#define rson o<<1|1, m+1, r//using ll = long long;//using ull= unsigned long long;//std::ios::sync_with_stdio(false);using namespace std;//priority_queue
,greater
> que;typedef long long ll;int ans;char s[110][110];int dir[4][2];int bit[50];int n,m;int cal(int n){ int ans=0 ; for (ans=0;n;ans++) { n&=(n-1); } return ans;}void dfs(int row,int pass,int now){ if(row==n) { int cur=max(pass,cal(now)); ans=min(ans,cur); return ; } dfs(row+1,pass+1,now); dfs(row+1,pass,now|bit[row]);}int main(){ freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); dir[0][0]=-1,dir[0][1]=0; dir[1][0]=1,dir[1][1]=0; dir[2][0]=0,dir[2][1]=1; dir[3][0]=0,dir[3][1]=-1; cin >> n >> m; ans=min(n,m); for(int i=0;i
View Code

D:BFS+SG函数 :如果一个点是必胜点 那么他后面和前面的点一定不是必胜点 反之一个点不是必胜点 那么他前面和后面的点的后继如果有必胜点 则他不是必胜点 如果没有 则他是必胜点

while(set.find(x)!=set.end()) x++ 当set为空时 返回1 当set为0-y连续的时 返回的是y+1 当0-y有缺少时 返回的是第一个缺少的数

#include 
#include
#include
#include
#define foror(i,a,b) for(i=a;i
b;i--)#define EPS 1.0e-6#define PI acos(-1.0)#define INF 3000000000#define MOD 1000000009#define mem(a,b) memset((a),b,sizeof(a))#define TS printf("!!!\n")#define lson o<<1, l, m#define rson o<<1|1, m+1, r//using ll = long long;//using ull= unsigned long long;//std::ios::sync_with_stdio(false);using namespace std;//priority_queue
,greater
> que;typedef long long ll;vector
tree[1005];//vector
newtree[1005];int visit[1005];int n,m;int sg[1005];queue
que;void bfs(){ visit[1]=1; while(!que.empty()) { int cur=que.front(); que.pop(); for(int i=0;i
visit[i]) newtree[i].push_back(tree[i][j]); } }}*/int sgdfs(int x){ if(sg[x]!=-1) return sg[x]; int zero=0; //one=-1; set
a; for(int i=0;i
visit[x]) a.insert(sgdfs(tree[x][i])); } while(a.find(zero)!=a.end()) zero++; sg[x]=zero; return sg[x];}int main(){ freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); mem(sg,-1); mem(visit,0); cin >> n >> m; int s,f; for(int i=1;i<=m;i++) { scanf("%d %d",&s,&f); tree[s].push_back(f); tree[f].push_back(s); } que.push(1); bfs(); //rebuild(); int ans=sgdfs(1); if(ans) cout<<"Vladimir"; else cout<<"Nikolay"; //for(int i=1;i<=n;i++) //ans=max(ans,visit[i]); return 0;}
View Code

F:浮标 

因为间距的单调不会使得答案单调,间距过大过小都会使得最后的移动距离不是最优,所以是使用三分而不是二分

对于每次三分,每次在n个点里面假设一个点不动,然后枚举完算一遍,取最优。

while(fabs(r - l) > eps) {        double mid = (l + r) / 2.0;        double midd = (mid + r) / 2.0;        if(cal(mid, 0) > cal(midd, 0)) l = mid;        else r = midd;    }    double ans = cal(l, 0) > cal(r, 0) ? r : l;
三分
#include 
using namespace std;#define N 405const double eps = 1e-12;double num[N];int n, id;double cal(double x, int flag) { double res = 0, ans = 100000000; for(int st = 1; st <= n; st++) { res = 0; for(int i = 1; i < st; i++) res += fabs(num[st] - (st - i) * x - num[i]); for(int i = st + 1; i <= n; i++) res += fabs(num[st] + (i - st) * x - num[i]); if(ans > res) ans = res, id = st; } return ans;}void solve() { scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%lf", &num[i]); double l = 0, r = 100000000; while(fabs(r - l) > eps) { double mid = (l + r) / 2.0; double midd = (mid + r) / 2.0; if(cal(mid, 0) > cal(midd, 0)) l = mid; else r = midd; } double ans = cal(l, 0) > cal(r, 0) ? r : l; double res = cal(ans, 1); printf("%.4f\n", res); for(int i = 1; i < id; i++) printf("%.10f ", num[id] - (id - i) * ans); printf("%.10f ", num[id]); for(int i = id + 1; i <= n; i++) printf("%.10f ", num[id] + (i - id) * ans);}int main() { freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); solve(); return 0;}
View Code

G:在线-->可持久化线段树(主席树    离线-->权值线段树

#include
using namespace std;const int maxn=1000007;struct { int l,r,loca;}tr[maxn*40];int tot,A[maxn],rt[maxn];void pushup(int x){ tr[x].loca=min(tr[tr[x].l].loca,tr[tr[x].r].loca);}void insert(int &x,int l,int r,int a,int b){ tr[++tot]=tr[x]; x=tot; if(l==r){ tr[x].loca=b; return ; } int mid=(l+r)>>1; if(a<=mid) insert(tr[x].l,l,mid,a,b); else insert(tr[x].r,mid+1,r,a,b); pushup(x);}int query(int x,int l,int r,int a){ if(l==r)return l; int mid=(l+r)/2; if(tr[tr[x].l].loca
View Code

I:莫队

K:可持久化并查集

转载于:https://www.cnblogs.com/Aragaki/p/7197855.html

你可能感兴趣的文章
Tomcat运行Java Web内存溢出总结
查看>>
转:MOSS站点的迁移(备份还原)
查看>>
Spring 容器初始化源码跟读refresh05
查看>>
《剑指offer》和为S的两个数字
查看>>
LeetCode:Sort List
查看>>
准备用PHP做一个论坛小项目,来终止PHP的深入研究。准备转.net了
查看>>
hdu1085
查看>>
Intro Of Myself
查看>>
Qt之布局管理——堆栈窗体
查看>>
字符串转换数组
查看>>
shell小程序
查看>>
C# 插件式开发
查看>>
解决CentOS添加新网卡后找不到网卡配置文件
查看>>
毕设问题小记——Extjs报buffered未定义错误
查看>>
Python package下载中遇到ReadTimeoutError: HTTPSConnectionPool?
查看>>
redis和memcache的区别和应用场景
查看>>
自我介绍与提问
查看>>
数据结构:栈 顺序表方法和单链表方法(python版)
查看>>
数据结构:优先队列 基于堆实现(python版)
查看>>
org.hibernate.exception.GenericJDBCException: could not execute statement
查看>>