1,最高分是多少;2,势能线段树:1,and RMQ;2,花神游历各国;3:flood fill bfs搜索:1,池塘计数;2,城堡问题;
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,花神游历各国;
不明原因爆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<
很裸的搜索题,直接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++,算法)