A.Check In
题目:
https://www.bnuoj.com/v3/problem_show.php?pid=51635
题意:
找到所有是bnu的账号数量
思路:
所有是bnu的账号加入map中判重就行了
代码:
//kopyh
#include <bits/stdc++.h>
using namespace std;
int n,m,sum,res,flag;
map<string,int>mp;
string s,tt="bnu16-";
int main()
{
int i,j,k,cas,T,t,x,y,z;
scanf("%d",&T);
cas=0;
while(T--)
{
scanf("%d",&n);
sum=0;mp.clear();
for(i=0;i<n;i++)
{
cin>>s;
string st = s.substr(0,6);
if(st==tt&&mp[s]==0)sum++,mp[s]=1;
}
printf("%d\n",sum);
}
return 0;
}
B.Squared Permutation
题目:
https://www.bnuoj.com/v3/problem_show.php?pid=51636
题意:
1~n张牌,每张牌对应的值是该牌数值对应位置的牌上的值。求区间和
思路:
区间和直接线段树搞一下,因为修改值时指向的位置改变所以本身的数值改变,而且指向这个位置的数值也会改变,所以更新时是四次更新。
代码:
//kopyh
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define N 112345
using namespace std;
int n,m,sum,res,flag;
int a[N],b[N];
#define root 1 , n , 1
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
struct node
{
long long pos,val;
node(long long x=0,long long y=0){pos=x,val=y;}
}arr[N<<2];
int tot;
void pushUp(int rt)
{
arr[rt].val = arr[rt<<1].val+arr[rt<<1|1].val;
}
void updata(int l,int r,int rt,int ql,int qr,long long val)
{
if(l>qr||ql>r)return;
if(l>=ql&&r<=qr)
{
arr[rt].val = val;
return;
}
int m = (l+r)>>1;
if(ql<=m)updata(lson,ql,qr,val);
if(qr>m)updata(rson,ql,qr,val);
pushUp(rt);
}
void build(int l,int r,int rt)
{
if(l == r)
{
arr[rt].val = a[a[++tot]];
arr[rt].pos = tot;
return;
}
int m = (l+r)>>1;
build(lson);
build(rson);
pushUp(rt);
}
long long query(int l,int r,int rt,int ql,int qr)
{
if(l>qr||ql>r)
return 0;
if(l>=ql&&r<=qr)
return arr[rt].val;
int m = (l+r)>>1;
return query(lson,ql,qr)+query(rson,ql,qr);
}
int main()
{
int i,j,k,cas,T,t,x,y,z;
scanf("%d",&T);
cas=0;
while(T--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&a[i]);
for(i=1;i<=n;i++)b[a[i]]=i;
tot=0;
build(root);
scanf("%d",&m);
while(m--)
{
scanf("%d%d%d",&z,&x,&y);
if(z==1)
{
a[x]^=a[y],a[y]^=a[x],a[x]^=a[y];
b[a[x]]=x;
b[a[y]]=y;
updata(root,x,x,a[a[x]]);
updata(root,y,y,a[a[y]]);
updata(root,b[y],b[y],a[y]);
updata(root,b[x],b[x],a[x]);
}
else
printf("%lld\n",query(root,x,y));
}
}
return 0;
}