2019CCPC网络预选赛解题报告

HDU 6709 Fishing Master

来自队友:题解

HDU 6702 ^&^

/*************
题目:HDU 6702 ^&^
链接:https://vjudge.net/problem/HDU-6702
题意:给一个A,B,输出(A xor C) & (B xor C)值最小的正整数C
类型:思维
思路:输出A&B,如果A&B==0输出1即可
*************/
#include
using namespace std;
#define ll long long
#define met(a,b) memset(a,b,sizeof(a))
#define ios1 ios::sync_with_stdio(false)
#define ios2 cin.tie(0);cout.tie(0)
const int maxn = 1e5+5;
const ll mod = 1e9+7;
const int inf = 0x3f3f3f3f;

int main()
{
    int t;scanf("%d",&t);
    while(t--){
        ll a,b;
        scanf("%lld%lld",&a,&b);
        if((a&b)==0) printf("1\n");
        else printf("%lld\n",a&b);
    }
    return 0;
}

HDU 6707 Shuffle Card

/*************
题目:HDU 6707 Shuffle Card
链接:https://vjudge.net/problem/HDU-6707
题意:一副牌由n张牌组成。每张卡片都是不同的,编号1到n。起初,牌序为1到n。现在有m次操作,每次抽取一个编号,将该编号的牌放到第一张牌的位置。最后输出所有操作后的卡牌的顺序。
类型:思维
思路:n和m的范围都是1e5,加起来不会爆栈,所以直接拿栈做,然后再用map维护,输出从栈顶往下每个第一次出现的编号。
*************/
#include
using namespace std;
#define ll long long
#define met(a,b) memset(a,b,sizeof(a))
#define ios1 ios::sync_with_stdio(false)
#define ios2 cin.tie(0);cout.tie(0)
const int maxn = 1e5+5;
const ll mod = 1e9+7;
const int inf = 0x3f3f3f3f;

int n,t,m;
int a[maxn],num;
stacksta;
mapmp;
int main(){
    scanf("%d%d",&n,&m);
    for(int i=0;i=0;i--){sta.push(a[i]);mp[a[i]]++;} 
    for(int i=0;i

HDU 6708 Windows Of CCPC

/*************
题目:HDU 6708 Windows Of CCPC
链接:https://vjudge.net/problem/HDU-6708
题意:递推的模拟,每次左上角,右上角,右下角不变,左下角CCPC取反即可
类型:模拟
思路:模拟
*************/
#include
using namespace std;
#define ll long long
#define met(a,b) memset(a,b,sizeof(a))
#define ios1 ios::sync_with_stdio(false)
#define ios2 cin.tie(0);cout.tie(0)
const int maxn = 1e5+5;
const ll mod = 1e9+7;
const int inf = 0x3f3f3f3f;

struct node{
    char a[1500][1500];
}x[15];

int main()
{
    ios1;ios2;
    int t;cin>>t;
    x[1].a[1][1]=x[1].a[1][2]=x[1].a[2][2]='C';
    x[1].a[2][1]='P';
    for(int i=2;i<=10;i++){
        int y=1<<(i-1);
        for(int j=1;j<=y;j++){
            for(int k=1;k<=y;k++){
                x[i].a[j][k]=x[i].a[j][k+y]=x[i].a[j+y][k+y]=x[i-1].a[j][k];
                if(x[i-1].a[j][k]=='P') x[i].a[j+y][k]='C';
                else x[i].a[j+y][k]='P';
            }
        }
    }
    while(t--){
        int k;cin>>k;
        int n=1<

HDU 6704 K-th occurrence

/*************
题目:HDU 6704 K-th occurrence
链接:https://vjudge.net/problem/HDU-6704
题意:一个字符串,对于每次询问,从l到r的子串在主串中第k次出现的下标是多少,不存在输出-1
类型:后缀数组+ST表+二分+主席树
思路:ST表维护后缀数组排序的ht数组(最长公共长度)的最小值,二分找出左右符合的位置,最后主席树维护后缀数组,求区间第k大
*************/
#include
using namespace std;

const int maxn = 1e5+5;
char s[maxn];
int tmp[maxn],rk[maxn],ht[maxn],sa[maxn],str[maxn],st[maxn][22];

int k,n,m;
bool cmp(int i, int j)
{
	if(rk[i] != rk[j]) return rk[i] < rk[j];
	else {
		int ri = i+k<=n? rk[i+k] : -1;
		int rj = j+k<=n? rk[j+k] : -1;
		return ri0;i--) sa[i] = sa[i-1];sa[0]=n;
	int x=0;
	for(int i=0;i<=n;i++) rk[sa[i]] = i;
	for(int i=0;i>1;
	if(pos <= mid) tree[cur].l = update(tree[pre].l, l, mid, pos);
	else tree[cur].r = update(tree[pre].r, mid+1, r, pos);
	return cur;
}

int query(int pl, int pr, int l, int r, int k){
	if(l == r) return l;
	int mid = (l+r)>>1;
	if(tree[tree[pr].l].val - tree[tree[pl].l].val >= k) return query(tree[pl].l, tree[pr].l, l, mid, k);
	else return query(tree[pl].r, tree[pr].r, mid+1, r, k-(tree[tree[pr].l].val - tree[tree[pl].l].val));
}

int main()
{
    int T;scanf("%d",&T);
    while(T--){
    	scanf("%d%d",&n,&m);
    	scanf("%s",s);
    	for(int i=0;i>1;
				int cnt = 100000;
				if(mid+1 <= l) cnt = que_st(mid+1,l);
				if(cnt >= len) cntl = mid,rr = mid - 1;
				else ll = mid + 1;
			}
			ll = l, rr = n;
			while(ll <= rr){
				int mid = (ll+rr)>>1;
				int cnt = 100000;
				if(l+1 <= mid) cnt = que_st(l+1,mid);
				if(cnt >= len) cntr =  mid, ll =  mid +1;
				else rr = mid - 1;
			}
			if(cntr-cntl+1

 

你可能感兴趣的:(2019CCPC网络预选赛解题报告)