22/5/10

1,最高分是多少;2,势能线段树:1,and RMQ;2,花神游历各国;3:flood fill bfs搜索:1,池塘计数;2,城堡问题;


1,最高分是多少

22/5/10_第1张图片

注意多组输入数据!!

#include
#define rep1(i,a,n) for(ll i=a;ia;i--) 
#define per2(i,n,a) for(ll i=n;i>=a;i--)
#define quick_cin() cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)
#define INF 0x3f3f3f3f
#define pb push_back
#define endl "\n"
#define lowbit(m) (-m&m)
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
using namespace std;
typedef long long ll;
typedef pair PII;
typedef double db;
const int N=3e4+10;
int n,q;
int w[N];
struct node
{
	int l,r;
	int v;
}tr[N<<2];
void pushup(int u)
{
	tr[u].v=max(tr[u<<1].v,tr[u<<1|1].v);
}
void build(int u,int l,int r)
{
	if(l==r)tr[u]={l,r,w[r]};
	else
	{
		tr[u]={l,r};
		int mid=l+r>>1;
		build(u<<1,l,mid),build(u<<1|1,mid+1,r);
		pushup(u);
	}
}
void modify(int u,int x,int v)
{
	if(tr[u].l==x&&tr[u].r==x)tr[u].v=v;
	else
	{
		int mid=tr[u].l+tr[u].r>>1;
		if(x<=mid)modify(u<<1,x,v);
		else modify(u<<1|1,x,v);
		pushup(u);
	}
}
int query(int u,int l,int r)
{
	if(tr[u].l>=l&&tr[u].r<=r)return tr[u].v;
	int mid=tr[u].l+tr[u].r>>1;
	int a=INT_MIN,b=INT_MIN;
	if(l<=mid)
	{
		a=query(u<<1,l,r);
		//cout<mid)
	{
		b=query(u<<1|1,l,r);
	//	cout<r)swap(l,r);
				printf("%d\n",query(1,l,r));
			}
			else
			{
				scanf("%d%d",&x,&d);
				modify(1,x,d);
			}
		}
	}
	return 0;
}

势能线段树;

其实就是找优化的地方,对于难维护的信息进行区间修改且必须单个修改的话,找优化的点,然后return剪枝;

1,and RMQ;

题意:三个操作,①l~r上每个ai&v,②:将ai修改为v;③:查询l~r的最大值;

对于第一个操作,优化的地方在于如果区间和sum&v还是原来的值,这段区间就不用改了,最大值不会变;

#include
#define rep1(i,a,n) for(ll i=a;ia;i--) 
#define per2(i,n,a) for(ll i=n;i>=a;i--)
#define quick_cin() cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)
#define INF 0x3f3f3f3f
#define pb push_back
#define endl "\n"
#define lowbit(m) (-m&m)
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
using namespace std;
typedef long long ll;
typedef pair PII;
typedef double db;
const int N=4e5+10;
int n,p;
int w[N];
struct node
{
	int l,r;
	int maxv;
	int sum;
}tr[N<<2];
void pushup(int u)
{
	tr[u].maxv=max(tr[u<<1].maxv,tr[u<<1|1].maxv);
	tr[u].sum=tr[u<<1].sum|tr[u<<1|1].sum;
}
void build(int u,int l,int r)
{
	if(l==r)tr[u]={l,r,w[r],w[r]};
	else
	{
		tr[u]={l,r};
		int mid=l+r>>1;
		build(u<<1,l,mid),build(u<<1|1,mid+1,r);
		pushup(u);
	}
}
void modify(int u,int x,int v)
{
	if(tr[u].l==x&&tr[u].r==x)tr[u].maxv=v,tr[u].sum=v;
	else
	{
		int mid=tr[u].l+tr[u].r>>1;
		if(x<=mid)modify(u<<1,x,v);
		else modify(u<<1|1,x,v);
		pushup(u);
	}
}
void modify(int u,int l,int r,int v)
{
	if(tr[u].l==tr[u].r)
	{
		tr[u].maxv&=v;
		tr[u].sum&=v;
		return;
	}
	if((tr[u].sum&v)==tr[u].sum)return;
	int mid=tr[u].l+tr[u].r>>1;
	if(l<=mid)modify(u<<1,l,r,v);
	if(r>mid)modify(u<<1|1,l,r,v);
	pushup(u);
}
int query(int u,int l,int r)
{
	if(l<=tr[u].l&&tr[u].r<=r)return tr[u].maxv;
	int mid=tr[u].l+tr[u].r>>1;
	int a=0,b=0;
	if(l<=mid)a=query(u<<1,l,r);
	if(r>mid)b=query(u<<1|1,l,r);
	return max(a,b);
}
signed main()
{
    quick_cin();
	cin>>n>>p;
	rep2(i,1,n)cin>>w[i];
	build(1,1,n);
	int l,r,x,d;
	while(p--)
	{
		string c;
		cin>>c;
		if(c[0]=='Q')
		{
			cin>>l>>r;
			cout<>x>>d;
			modify(1,x,d);
		}
		else
		{
			cin>>l>>r>>d;
			modify(1,l,r,d);
		}
	}
    return 0;
}

2,花神游历各国;

22/5/10_第2张图片

 不明原因爆int ,直接#define int ll 给过了;

#include
#define rep1(i,a,n) for(ll i=a;ia;i--) 
#define per2(i,n,a) for(ll i=n;i>=a;i--)
#define quick_cin() cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)
#define INF 0x3f3f3f3f
#define pb push_back
#define endl "\n"
#define lowbit(m) (-m&m)
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
#define int ll
using namespace std;
typedef long long ll;
typedef pair PII;
typedef double db;
const int N=1e6+10;
int n,p;
int w[N];
struct node
{
	int l,r;
	int maxv;
	ll sum;
}tr[N<<2];
void pushup(int u)
{
	tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
	tr[u].maxv=max(tr[u<<1].maxv,tr[u<<1|1].maxv);
}
void build(int u,int l,int r)
{
	if(l==r)tr[u]={l,r,w[r],w[r]};
	else
	{
		tr[u]={l,r};
		int mid=l+r>>1;
		build(u<<1,l,mid),build(u<<1|1,mid+1,r);
		pushup(u);
	}
}
void modify(int u,int l,int r)
{
	if(tr[u].l>=l&tr[u].r<=r)
	{
		if(tr[u].maxv<2)return;
		if(tr[u].l==tr[u].r)
		{
			tr[u].maxv=(int)sqrt(tr[u].maxv);
			tr[u].sum=(ll)sqrt(tr[u].sum);
			return;
		}
	}
	int mid=tr[u].l+tr[u].r>>1;
	if(l<=mid)modify(u<<1,l,r);
	if(r>mid)modify(u<<1|1,l,r);
	pushup(u);
}
ll query(int u,int l,int r)
{
	if(l<=tr[u].l&&tr[u].r<=r)return tr[u].sum;
	int mid=tr[u].l+tr[u].r>>1;
	ll a=0,b=0;
	if(l<=mid)a=query(u<<1,l,r);
	if(r>mid)b=query(u<<1|1,l,r);
	return a+b;
}
signed main()
{
    quick_cin();
	cin>>n;
	rep2(i,1,n)cin>>w[i];
	build(1,1,n);
	cin>>p;
	int l,r,x,d;
	while(p--)
	{
		int c;
		cin>>c>>l>>r;
		if(l>r)swap(l,r);
		if(c==1) cout<

1,池塘计数;22/5/10_第3张图片

 很裸的搜索题,直接bfs;

wa代码:

#include
#define rep1(i,a,n) for(ll i=a;ia;i--) 
#define per2(i,n,a) for(ll i=n;i>=a;i--)
#define quick_cin() cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)
#define INF 0x3f3f3f3f
#define pb push_back
#define endl "\n"
#define lowbit(m) (-m&m)
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
using namespace std;
typedef long long ll;
typedef pair PII;
typedef double db;
const int N=1e3+10;
int ans;
bool st[N][N];
char a[N][N];
int n,m;
void bfs(int x,int y)
{
	queueq;
	ans++;
	q.push({x,y});
	st[x][y]=1;
	while(q.size())
	{
		auto t=q.front();q.pop();
		int x1=t.first,y1=t.second;
	//	cout<0&&i<=n&&j>0&&j<=m)
			 {
			 	q.push({i,j});
			 	st[i][j]=1;
			 }	
		 }
	}
	
}
signed main()
{
    quick_cin();
	cin>>n>>m;
	rep2(i,1,n)
	 rep2(j,1,m)cin>>a[i][j];
	rep2(i,1,n)
	 rep2(j,1,m)if(!st[i][j]&&a[i][j]=='W')bfs(i,j);
	cout<

2,城堡问题;

wa代码

#include
#define rep1(i,a,n) for(ll i=a;ia;i--) 
#define per2(i,n,a) for(ll i=n;i>=a;i--)
#define quick_cin() cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)
#define INF 0x3f3f3f3f
#define pb push_back
#define endl "\n"
#define lowbit(m) (-m&m)
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
#define yi first
#define er second
using namespace std;
typedef long long ll;
typedef pair PII;
typedef double db;
const int N=1e3+10;
int g[N][N];
bool st[N][N];
int n,m;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
int bfs(int x,int y)
{
	queueq;
	q.push({x,y});
	st[x][y]=1;
	int area=0;
	while(q.size())
	{
		auto t=q.front();q.pop();
		area++;
		rep1(i,0,4)
		{
			int xx=t.yi+dx[i],yy=t.er+dy[i];
			if(xx<1||xx>n||yy<1||yy>m)continue;
			if(st[xx][yy])continue;
			if(g[t.yi][t.er]>>i&1)continue;
			q.push({xx,yy});
			st[xx][yy]=1;
		}
	}
	return area;
}
signed main()
{
    quick_cin();
	cin>>n>>m;
	rep2(i,1,n)
	 rep2(j,1,m)cin>>g[i][j];
	int maxs=0,num=0;
	rep2(i,1,n)
	 rep2(j,1,m)
	 {
	 	if(!st[i][j])
	 	{
	 		num++;
			maxs=max(maxs,bfs(i,j));	
		}
	 }
	cout<

你可能感兴趣的:(c++,算法)