• P4273 [NOI2004] 降雨量


    Aimee

    把马路竖起来,横轴是时间

    那么显然扫过的面积就是遮挡的水量

    之后就是计算几何的事了

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,k;
    int xx[505],yy[505];
    int x,y;
    struct b{
    	int f;
    	int t;
    	double l;
    } ed[2500];
    int fa[100001];
    int bl[2500];
    struct re{
    	int lx,rx,uy,dy;
    }rec[2500];
    re tem;
    re recc[5];
    int find(int x){
    	return fa[x]==x?x:fa[x]=find(fa[x]);
    }
    int f(int x){
    	return x*x;
    }
    int di(int x,int y){
    	return f(xx[x]-xx[y])+f(yy[x]-yy[y]);
    }
    bool cmp(b x,b y){
    	return x.l<y.l;
    }
    int p;
    void add(int f,int to,int ne){
    	ed[++p].f=f;
    	ed[p].t=to;
    	ed[p].l=ne;
    	return ;
    }
    int cnt;
    void com(int x,int y){
    	recc[y].lx=min(recc[y].lx,rec[x].lx);
    	recc[y].uy=min(recc[y].uy,rec[x].uy);
    	recc[y].rx=max(recc[y].rx,rec[x].rx);
    	recc[y].dy=max(recc[y].dy,rec[x].dy);
    }
    void can(int x,int y,re tem){
    	//cnt--;
    	recc[y]=tem;
    }
    int Aimee;
    int znx=0x3fffff;
    int ss(){
    		Aimee=0;
    	for(int i=1;i<=cnt;++i){
    			Aimee+=(recc[i].rx-recc[i].lx)*(recc[i].dy-recc[i].uy);
    	}
    	return Aimee;
    }
    void endd(){
    	Aimee=0;
    	for(int i=1;i<=cnt;++i){
    			Aimee+=(recc[i].rx-recc[i].lx)*(recc[i].dy-recc[i].uy);
    	}   
    	znx=min(znx,Aimee);
    }
    bool ch(int i,int xx,int yy){
    	return (xx<=recc[i].rx&&xx>=recc[i].lx&&recc[i].dy>=yy&&recc[i].uy<=yy);
    }
    bool che(int x,int xx,int yy){
    	for(int i=1;i<=cnt;++i){
    		if(i==x)
    		continue;
    		if(ch(x,recc[i].lx,recc[i].dy)||
    		ch(x,recc[i].lx,recc[i].uy)||
    		ch(x,recc[i].rx,recc[i].dy)||
    		ch(x,recc[i].rx,recc[i].uy))
    		return 0;
    	}
    	return 1;
    }
    void kr(int i,int s){
    	if(s>znx){
    		return ;
    	}
    	if(i==n+1){
    		if(cnt==k) 
    		znx=s;
    		return ;
    	}
    	if(cnt<k){
    		re tem=recc[cnt+1];
    		cnt++;
    		recc[cnt]=rec[i];
    		if(che(cnt,rec[i].lx,rec[i].dy))
    		kr(i+1,ss());
    		recc[cnt]=tem;
    		cnt--;
    	}
    	for(int j=1;j<=cnt;++j){
    		re tem=recc[j];
    		com(i,j);
    		if(che(j,rec[i].lx,rec[i].dy))
    		kr(i+1,ss());
    		can(i,j,tem);
    	}
    }
    int main(){
    	scanf("%d%d",&n,&k);
    	for(int i=1;i<=n;++i){
    		scanf("%d%d",&x,&y);
    		rec[i].lx=rec[i].rx=x;
    		rec[i].dy=rec[i].uy=y;
    	}
    	kr(1,0);
    	cout<<znx;
    	return 0;
    }
    ```
    ```
    `那么显然扫过的面积就是遮挡的水量
    
    之后就是计算几何的事了
    
    ````cpp
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,k;
    int xx[505],yy[505];
    int x,y;
    struct b{
    	int f;
    	int t;
    	double l;
    } ed[2500];
    int fa[100001];
    int bl[2500];
    struct re{
    	int lx,rx,uy,dy;
    }rec[2500];
    re tem;
    re recc[5];
    int find(int x){
    	return fa[x]==x?x:fa[x]=find(fa[x]);
    }
    int f(int x){
    	return x*x;
    }
    int di(int x,int y){
    	return f(xx[x]-xx[y])+f(yy[x]-yy[y]);
    }
    bool cmp(b x,b y){
    	return x.l<y.l;
    }
    int p;
    void add(int f,int to,int ne){
    	ed[++p].f=f;
    	ed[p].t=to;
    	ed[p].l=ne;
    	return ;
    }
    int cnt;
    void com(int x,int y){
    	recc[y].lx=min(recc[y].lx,rec[x].lx);
    	recc[y].uy=min(recc[y].uy,rec[x].uy);
    	recc[y].rx=max(recc[y].rx,rec[x].rx);
    	recc[y].dy=max(recc[y].dy,rec[x].dy);
    }
    void can(int x,int y,re tem){
    	//cnt--;
    	recc[y]=tem;
    }
    int Aimee;
    int znx=0x3fffff;
    int ss(){
    		Aimee=0;
    	for(int i=1;i<=cnt;++i){
    			Aimee+=(recc[i].rx-recc[i].lx)*(recc[i].dy-recc[i].uy);
    	}
    	return Aimee;
    }
    void endd(){
    	Aimee=0;
    	for(int i=1;i<=cnt;++i){
    			Aimee+=(recc[i].rx-recc[i].lx)*(recc[i].dy-recc[i].uy);
    	}   
    	znx=min(znx,Aimee);
    }
    bool ch(int i,int xx,int yy){
    	return (xx<=recc[i].rx&&xx>=recc[i].lx&&recc[i].dy>=yy&&recc[i].uy<=yy);
    }
    bool che(int x,int xx,int yy){
    	for(int i=1;i<=cnt;++i){
    		if(i==x)
    		continue;
    		if(ch(x,recc[i].lx,recc[i].dy)||
    		ch(x,recc[i].lx,recc[i].uy)||
    		ch(x,recc[i].rx,recc[i].dy)||
    		ch(x,recc[i].rx,recc[i].uy))
    		return 0;
    	}
    	return 1;
    }
    void kr(int i,int s){
    	if(s>znx){
    		return ;
    	}
    	if(i==n+1){
    		if(cnt==k) 
    		znx=s;
    		return ;
    	}
    	if(cnt<k){
    		re tem=recc[cnt+1];
    		cnt++;
    		recc[cnt]=rec[i];
    		if(che(cnt,rec[i].lx,rec[i].dy))
    		kr(i+1,ss());
    		recc[cnt]=tem;
    		cnt--;
    	}
    	for(int j=1;j<=cnt;++j){
    		re tem=recc[j];
    		com(i,j);
    		if(che(j,rec[i].lx,rec[i].dy))
    		kr(i+1,ss());
    		can(i,j,tem);
    	}
    }
    int main(){
    	scanf("%d%d",&n,&k);
    	for(int i=1;i<=n;++i){
    		scanf("%d%d",&x,&y);
    		rec[i].lx=rec[i].rx=x;
    		rec[i].dy=rec[i].uy=y;
    	}
    	kr(1,0);
    	cout<<znx;
    	return 0;
    }
    
  • 相关阅读:
    VS2013
    有了门面,程序会更加体面!- pos软件基于三层架构 -09
    无熟人难办事?- 闲聊设计模式-迪米特法则
    三层架构,分层开发
    Filezilla 错误
    归档和压缩
    在Linux系统下用dd命令制作ISO镜像U盘启动盘
    脚本语言
    node.js知识点提取
    npm cnpm
  • 原文地址:https://www.cnblogs.com/For-Miku/p/14387984.html
Copyright © 2020-2023  润新知