• 2015 ICPC 北京


    A Xiongnu's Land

    二分答案。

    #include <bits/stdc++.h>
    
    using namespace std;
    typedef long long ll;
    
    struct node{
    	int x,y,lx,ly;
    	void in(){
    		scanf("%d%d%d%d",&x,&y,&lx,&ly);
    	}
    	ll calc(int mid){
    		if(x+lx<=mid) return (ll)lx*ly;
    		if(x<mid&&x+lx>=mid) return (ll)(mid-x)*ly;
    		return 0ll;
    	}
    }info[100005];
    int T,n,R;
    
    int main(){
    	//freopen("in.txt","r",stdin);
    	for(scanf("%d",&T);T--;){
    		scanf("%d%d",&R,&n);
    		ll s0=0;
    		for(int i=1;i<=n;i++)
    			info[i].in(),s0+=info[i].calc(R);
    		int l=1,r=R,res=-1;
    		ll rs1=0;
    		while(l<=r){
    			int mid=(l+r)/2;
    			ll s1=0;
    			for(int i=1;i<=n;i++){
    				s1+=info[i].calc(mid);
    			}
    			if(s1>=s0-s1){
    				r=mid-1;
    				rs1=s1;
    			} else {
    				l=mid+1;
    			}
    		}
    		l=1,r=R;
    		while(l<=r){
    			int mid=(l+r)/2;
    			ll s1=0;
    			for(int i=1;i<=n;i++){
    				s1+=info[i].calc(mid);
    			}
    			if(s1<=rs1){
    				l=(res=mid)+1;
    			} else {
    				r=mid-1;
    			}
    		}
    		printf("%d
    ",res);
    	}
    	return 0;
    }
    

    D Kejin Game

    最小割模型,拆点求最大流。

    #include<bits/stdc++.h>
    #define inf 0x3f3f3f3f
    #define maxn 1050
    using namespace std;
    int t,n,m,k; 
    struct Edge{
    	int from,to,cap,flow;
    };
    struct Dinic{
    	int n,m,s,t;
    	vector<Edge>edges;
    	vector<int>G[maxn];
    	bool vis[maxn];
    	int d[maxn];
    	int cur[maxn];
    	void ClearAll(int n){
    		for(int i=0;i<n;i++) G[i].clear();
    		edges.clear();
    	}
    	void AddEdge(int from,int to,int cap){
    		edges.push_back((Edge){from,to,cap,0});
    		edges.push_back((Edge){to,from,0,0});
    		m=edges.size();
    		G[from].push_back(m-2);
    		G[to].push_back(m-1);
    	}
    	bool BFS(){
    		memset(vis,0,sizeof(vis));
    		queue<int>Q;
    		Q.push(s);
    		vis[s]=1,d[s]=0;
    		while(!Q.empty()){
    			int x=Q.front();
    			Q.pop();
    			for(int i=0;i<G[x].size();i++){
    				Edge& e=edges[G[x][i]];
    				if(!vis[e.to] && e.cap>e.flow){
    					vis[e.to]=1;
    					d[e.to]=d[x]+1;
    					Q.push(e.to);
    				}
    			}
    		}
    		return vis[t];
    	}
    	int DFS(int x,int a){
    		if(x==t || a==0) return a;
    		int flow=0,f;
    		for(int& i=cur[x];i<G[x].size();i++){
    			Edge& e=edges[G[x][i]];
    			if(d[x]+1==d[e.to] && (f=DFS(e.to,min(a,e.cap-e.flow)))>0){
    				e.flow+=f;
    				edges[G[x][i]^1].flow-=f;
    				flow+=f;
    				a-=f;
    				if(a==0) break;
    			}
    		}
    		return flow;
    	}
    	int maxflow(int s,int t){
    		this->s=s,this->t=t;
    		int flow=0;
    		while(BFS()){
    			memset(cur,0,sizeof(cur));
    			flow+=DFS(s,inf);
    		}
    		return flow;
    	}
    }g;
    int main(){
    //	freopen("input.txt","r",stdin);
    	scanf("%d",&t);
    	while(t--){
    		scanf("%d%d%d",&n,&m,&k);
    		g.ClearAll(maxn);
    		int S=0,T=2*n+1;
    		while(m--){
    			int u,v,w;
    			scanf("%d%d%d",&u,&v,&w);
    			g.AddEdge(u+n,v,w);
    		}
    		for(int i=1;i<=n;i++){
    			int x;
    			scanf("%d",&x);
    			g.AddEdge(S,i,x);
    		}
    		for(int i=1;i<=n;i++){
    			int x;
    			scanf("%d",&x);
    			g.AddEdge(i,i+n,x);
    		}
    		g.AddEdge(k+n,T,inf);
    		int ans=g.maxflow(S,T);
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    

    G Mysterious Antiques in Sackler Museum

    #include <bits/stdc++.h>
    
    using namespace std;
    
    
    int a[10][10];
    int tmp[10];
    int T;
    bool check(int x,int y,int z) {
    	int flag=0;
    	for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) {
    		if(a[x][i]==a[y][j]&& a[x][i]==a[z][k]) flag=1;
    		if(a[x][i]==a[y][j]+a[z][k]&& a[y][j^1]==a[z][k^1]) flag=1;
    
    		if(flag) return true;
    	}
    	if(!flag) return false;
    }
    int main() {
    	cin>>T;
    	while(T--) {
    		for(int i=0;i<4;i++) scanf("%d%d",&a[i][0],&a[i][1]);
    		for(int i=0;i<4;i++) tmp[i]=i;
    		int flag=0;	
    		do {
    			if(check(tmp[0],tmp[1],tmp[2])) {
    				flag=1;
    				break;
    			}
    		}while(next_permutation(tmp,tmp+4));
    		if(flag) printf("Yes
    ");
    		else printf("No
    ");
    	}
    
    	return 0;
    }
    

    I Snake Carpet

    构造
    奇数
    1 3 5 7
    3 3 5 7
    5 5 5 7
    7 7 7 7
    偶数
    2 2 6 6
    4 4 6 6
    4 4 6 6
    8 8 8 8
    8 8 8 8
    类似。

    #include <bits/stdc++.h>
    
    using namespace std;
    typedef long long ll;
    bool flg;
    int n;
    const int dx[]={1,-1,0,0};
    const int dy[]={0,0,-1,1};
    const int maxn = 1005;
    int mp[maxn][maxn];
    bool vis[maxn][maxn];
    vector<pair<int,int> > p[maxn];
    
    void print(int x,int y,int lft,int tp){
    	if(lft==0) return;
    	if(tp==1 && x>y) print(x,y+1,lft-1,1);
    	else if(tp==1&&x==y) print(x-1,y,lft-1,0);
    	else if(tp==0) print(x-1,y,lft-1,0);
    	if(flg) printf(" ");
    	flg=1;
    	printf("%d %d",x,y);
    }
    
    void print2(int x,int y,int lft,int bx,int by){
    	vis[x][y]=1;
    	if(lft==0) return;
    	for(int i=0;i<4;i++){
    		int nx=x+dx[i];
    		int ny=y+dy[i];
    		if(nx>=1 && ny>=1 && mp[nx][ny]==mp[x][y]&&vis[nx][ny]==0) print2(nx,ny,lft-1,bx,by);
    	}
    	if(flg) printf(" ");
    	flg=1;
    	printf("%d %d",x+bx,y+by);
    }
    
    void print3(int x,int y,int lft,int bx,int by){
    	vis[x][y]=1;
    	if(lft==0) return;
    	for(int i=0;i<4;i++){
    		int nx=x+dx[i];
    		int ny=y+dy[i];
    		if(nx>=1 && ny>=1 && mp[nx][ny]==mp[x][y]&&vis[nx][ny]==0) print3(nx,ny,lft-1,bx,by);
    	}
    	if(flg) printf(" ");
    	flg=1;
    	printf("%d %d",bx-y,by+x);
    }
    
    void init2(){
    	int tx=1,ty=0;
    	for(int i=2;i<=1000;i+=2){
    		if(i/2%2==1){
    			p[i].push_back(make_pair(1,ty+1));
    			for(int c=1;c<=i/2;c++)
    				for(int r=ty+1;r<=ty+2;r++)
    					mp[c][r]=i;
    			ty+=2;
    		} else {
    			p[i].push_back(make_pair(tx+1,1));
    			for(int c=tx+1;c<=tx+2;c++)
    				for(int r=1;r<=i/2;r++)
    					mp[c][r]=i;
    			tx+=2;
    		}
    	}
    }
    
    int main(){
    	//freopen("in.txt","r",stdin);
    	init2();
    	while(~scanf("%d",&n)){
    		memset(vis,0,sizeof vis);
    		if(n==1){
    			puts("1 1");
    			puts("1 1");
    		} else if(n==2){
    			puts("1 3");
    			puts("1 1");
    			puts("1 2 1 3");
    		} else if(n%4==3){//U
    			printf("%d %d
    ",n/2+1,n);
    			int tx=0,ty=0;
    			int tot=0;
    			for(int i=1;i<=n;i++){
    				if(i%2){
    					flg=0;
    					print(i/2+1,1,i,1);
    					puts("");
    				} else {
    					flg=0;
    					for(auto PP:p[i]){
    						print3(PP.first,PP.second,i,n/2+2,n/2+1);
    					}
    					puts("");
    				}
    			}
    		} else if(n%4==0){//U
    			printf("%d %d
    ",n/2,n+1);
    			for(int i=1;i<=n;i++){
    				if(i%2){
    					flg=0;
    					print(i/2+1,1,i,1);
    					puts("");
    				} else {
    					flg=0;
    					for(auto PP:p[i]){
    						print3(PP.first,PP.second,i,n/2+1,n/2);
    					}
    					puts("");
    				}
    			}
    		} else if(n%4==1){//L
    			printf("%d %d
    ",n/2+1,n);
    			for(int i=1;i<=n;i++){
    				if(i%2){
    					flg=0;
    					print(i/2+1,1,i,1);
    					puts("");
    				} else {
    					flg=0;
    					for(auto PP:p[i]){
    						print2(PP.first,PP.second,i,0,n/2+1);
    					}
    					puts("");
    				}
    			}
    		} else {		  //L
    			printf("%d %d
    ",n/2,n+1);
    			for(int i=1;i<=n;i++){
    				if(i%2){
    					flg=0;
    					print(i/2+1,1,i,1);
    					puts("");
    				} else {
    					flg=0;
    					for(auto PP:p[i]){
    						print2(PP.first,PP.second,i,0,n/2);
    					}
    					puts("");
    				}
    			}
    		}
    	}
    	return 0;
    }
    

    J Osu! Master

    #include <bits/stdc++.h>
    
    using namespace std;
    typedef long long ll;
    char opt[15];
    int num,lstopt,lstn;//0 S 1	C 2 B
    
    struct node{
    	char opt[15];
    	int num;
    }info[100005];
    
    int main(){
    	//freopen("in.txt","r",stdin);
    	int n;
    	while(~scanf("%d",&n)){
    		int res = 0;
    		for(int i=1;i<=n;i++){
    			scanf("%s",info[i].opt);
    			if(info[i].opt[0]!='S'){
    				scanf("%d",&info[i].num);
    			}
    		}
    		bool now=false;
    		for(int i=1;i<=n;i++){
    			if(!now){
    				if(info[i].opt[0]=='S'){
    					res++;
    				} else if(info[i].opt[0]=='C'&&info[i].num==1){
    					res++;
    					now=true;
    				} else if(info[i].opt[0]=='B'&&info[i].num==1){
    					res++;
    					now=true;
    				}
    			} else {
    				if(info[i].opt[0]=='S'){
    					res++;
    					now=false;
    					continue;
    				}
    				if(info[i].opt[0]==info[i-1].opt[0]&&info[i].num==info[i-1].num+1){
    
    				} else {
    					now=false;
    				}
    			}
    		}
    		cout<<res<<endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    年龄大的普通程序员最后的出路是哪里?
    PHP7数组的底层实现
    MySQL mysqldump数据导出详解
    swoole高性能赛事直播平台(笔记)
    防止图片盗链和资源恶意下载
    由Response.Redirect引发的"Thread was being aborted. "异常
    关于前台调用后台事件__doPostBack函数
    页面拖拽效果
    bs和cs缩放图片
    hideFocus(小技巧)
  • 原文地址:https://www.cnblogs.com/foreignbill/p/7847340.html
Copyright © 2020-2023  润新知