2019.11.05【NOIP提高組】模擬 B 組

JZOJ 3831 地圖的密度(水題)

代碼

#include <cstdio>
#include <cctype>
#define rr register
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
int n,m,a[261][261];
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
inline void print(int ans){
    if (ans>9) print(ans/10);
    putchar(ans%10+48);
}
signed main(){
	freopen("map.in","r",stdin);
	freopen("map.out","w",stdout);
	n=iut(); m=iut();
	for (rr int i=1;i<=n;++i)
	for (rr int j=1;j<=n;++j)
		a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+iut(); 
	for (rr int i=1;i<=n;++i)
	for (rr int j=1;j<=n;++j){
		rr int lx=max(i-m,1),ly=max(j-m,1),rx=min(i+m,n),ry=min(j+m,n);
		print(a[rx][ry]-a[lx-1][ry]-a[rx][ly-1]+a[lx-1][ly-1]),putchar(j==n?10:32); 
	}
	return 0;
}

JZOJ 3832 在哪裏建釀酒廠(水題)

代碼(O(n^2)卡常AC)

#include <cstdio>
#include <cctype>
#define rr register
#define min(a,b) ((a)>(b)?(b):(a))
using namespace std;
const int N=20011; typedef long long ll;
int n,a[N],dis[N]; ll pre[N],suf[N];
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
signed main(){
	freopen("bro.in","r",stdin);
	freopen("bro.out","w",stdout);
	n=iut(); rr ll ans=1e16;
	for (rr int i=1;i<=n;++i) a[i]=a[i+n]=iut(),dis[i]=dis[i+n]=iut();
	for (rr int i=2;i<=n*2;++i) a[i]+=a[i-1];
	for (rr int i=1;i<=n;++i){
		rr int l=i,r=i+n-1; pre[l]=suf[r]=0; rr ll now=1e16;
		for (rr int j=l+1;j<=r;++j) pre[j]=pre[j-1]+1ll*(a[j-1]-a[l-1])*dis[j-1];
		for (rr int j=r-1;j>=l;--j) suf[j]=suf[j+1]+1ll*(a[r]-a[j])*dis[j];
		for (rr int j=l;j<=r;++j) now=min(now,pre[j]+suf[j]); ans=min(ans,now);
	}
	return !printf("%lld",ans);
}
想看正解看看這個(https://blog.csdn.net/Mr_wuyongcong/article/details/102915841)

JZOJ 1956 洛谷 2449 矩形

題目

問多個矩形組成的圖形中有多少個連通塊


分析

分類討論,即可(我原來洛谷AC代碼結果WA掉了QAQ)


代碼

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
struct rec{int lx,ly,rx,ry;}a[7011];
int n,f[7011],ans,cnt[7011];
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
inline signed getf(int u){return f[u]==u?u:f[u]=getf(f[u]);}
signed main(){
	freopen("pro.in","r",stdin);
	freopen("pro.out","w",stdout);
	n=iut();
	for (rr int i=1;i<=n;++i) f[i]=i;
	for (rr int i=1;i<=n;++i){
		a[i]=(rec){iut(),iut(),iut(),iut()};
        for (rr int j=1;j<i;++j){
        	rr rec x=a[i],y=a[j],t; rr bool flag=0;
        	if (x.lx>y.lx||(x.lx==y.lx&&x.ly>y.ly)) t=x,x=y,y=t;
        	if (x.ly<=y.ly&&(y.lx<=x.rx&&y.ly<=x.ry)&&(x.rx!=y.lx||x.ry!=y.ly)) flag=1;
        	if (x.ly>y.ly&&(y.lx<=x.rx&&y.ry>=x.ly)&&(x.rx!=y.lx||x.ly!=y.ry)) flag=1;
        	if (flag){
        		rr int fa=getf(i),fb=getf(j);
        		rr int fc=fa<fb?fa:fb;
        		if (fa!=fb) f[fc]=fa^fb^fc;
			}
		}
	}
	for (rr int i=1;i<=n;++i) ans+=f[i]==i;
	return !printf("%d",ans);	
}

JZOJ 3833 平坦的折線

題目

現在我們在一張紙上有一個笛卡爾座標系。我們考慮在這張紙上用鉛筆從左到右畫的折線。我們要求任何兩個點之間連接的直線段與xx軸的夾角在4545-45\sim 45之間,一條滿足以上條件的折線稱之爲平坦的折線。假定給出了nn個不同的整點(座標爲整數的點),最少用幾條平坦的折線可以覆蓋所有的點?


分析

考慮把它轉換,首先把座標系逆時針旋轉45度,也就是
x=xcosθ+ysinθ,y=ycosθxsinθx'=x*\cos\theta+y*\sin\theta,y'=y*\cos\theta-x*\sin\theta
然後按照第一關鍵字爲橫座標從小到大排列,第二關鍵字爲縱座標從大到小排列,按照縱座標求最長不下降子序列長度即可


代碼

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=30011;
struct rec{int x,y;}a[N]; int n,b[N],len;
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans; 
}
bool cmp(const rec &a,const rec &b){return a.x<b.x||(a.x==b.x&&a.y>b.y);} 
signed main(){
	freopen("lam.in","r",stdin);
	freopen("lam.out","w",stdout);
	n=iut();
	for (rr int i=1;i<=n;++i){
		rr int x=iut(),y=iut();
		a[i]=(rec){x+y,y-x};
	}
	sort(a+1,a+1+n,cmp);
	b[++len]=a[1].y;
	for (rr int i=2;i<=n;++i){
		if (a[i].y>b[len]) b[++len]=a[i].y;
		else b[lower_bound(b+1,b+1+len,a[i].y)-b]=a[i].y;
	}
	return !printf("%d",len);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章