CSU 1981: 小M的魔术表演 1982: 小M的移动硬盘 1985: 驱R符 1987: 绚丽的手链

1981: 小M的魔术表演

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXN=2e5+5;
int n,m,cnt,root[MAXN],a[MAXN],x,y,k;

struct node
{
    int l,r,sum;
}T[MAXN*30];
vector<int> v;

int getid(int x)
{
    return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
}

//update(1,n,root[i],root[i-1],getid(a[i]));
void update(int l,int r,int &x,int y,int pos)
{
    T[++cnt]=T[y],T[cnt].sum++,x=cnt;
    if(l==r) return;
    int mid=(l+r)>>1;
    if(mid>=pos) update(l,mid,T[x].l,T[y].l,pos);
    else update(mid+1,r,T[x].r,T[y].r,pos);
}

//query(1,n,root[x-1],root[y],k)
int query(int l,int r,int x,int y,int k)
{
    if(l==r) return T[y].sum-T[x].sum;
    int mid=(l+r)>>1;
    int sum=T[T[y].l].sum-T[T[x].l].sum;
    if(mid>=k) return query(l,mid,T[x].l,T[y].l,k);
    else return sum+query(mid+1,r,T[x].r,T[y].r,k);
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        v.clear();
        cnt=0;
        memset(root,0,sizeof(root));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            v.push_back(a[i]);
        }
        sort(v.begin(),v.end());
        v.erase(unique(v.begin(),v.end()),v.end());
        int len=v.size();
        for(int i=1;i<=n;i++)
        {
            update(1,n,root[i],root[i-1],getid(a[i]));
        }
        while(m--)
        {
            scanf("%d%d%d",&x,&y,&k);
            int pos=getid(k);
            //cout<<"pos: "<<pos<<endl;
            if(pos>len)
            {
                printf("%d\n",y-x+1);
            }else
            {
                if(pos==1)
                {
                    printf("0\n");
                }else
                {
                    pos--;
                    printf("%d\n",query(1,n,root[x-1],root[y],pos));
                }
            }
        }
    }
    return 0;
}

1982: 小M的移动硬盘

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define MAXN 300010
typedef long long ll;
int m, n;
int l[MAXN], r[MAXN];
void init()
{
	r[0] = 1;
	l[n + 1] = n;
	for (int i = 1; i <= n; i++)
	{
		l[i] = i - 1;
		r[i] = i + 1;
	}
}
void con(int x, int y)
{
	r[x] = y;
	l[y] = x;
}
int main()
{
	int T,x,u,v;
	while (cin >> T)
	{
		while (T--)
		{
			cin >> n >> m;
			init();
			for (int i = 0; i < m; i++)
			{
				cin >> x;
				if (x == 1)
				{
					cin >> u;
					if (r[0] == u)
						continue;
					int l_u = l[u],r_u=r[u],r0=r[0];
					con(l_u, r_u);
					con(u, r0);
					con(0, u);
				}
				else if (x == 2)
				{
					cin >> u;
					if (l[n+1] == u)
						continue;
					int l_u = l[u], r_u = r[u], l_n = l[n+1];
					con(l_u, r_u);
					con(l_n, u);
					con(u, n+1);
				}
				else
				{
					cin >> u >> v;
					if (r[v] == u)
						continue;
					int l_u = l[u], r_u = r[u], r_v = r[v];
					con(l_u, r_u);
					con(u, r_v);
					con(v, u);
				}
			}
			int temp = r[0];
			cout << temp;
			while (r[temp] != (n + 1))
			{
				cout << " " << r[temp];
				temp = r[temp];
			}
			cout << endl;
		}
	}
	return 0;
}

1985: 驱R符

#include<cstdio>
#include<cstring>
#define maxl 50010

long long n;
long long f[maxl],dec[maxl];

int main()
{
	
	for(long long i=1;i<=50000;i++)
		dec[i]=dec[i-1]+i*(i-1);
	for(long long i=4;i<=50000;i++)
	{
		n=i-3;	
		f[i]=f[i-1]+(n+1)*n/2*n-dec[n];
	}
	int t;
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		scanf("%lld",&n);
		printf("%lld\n",f[n]);
	}
	return 0;
}

1987: 绚丽的手链

#include <iostream>
#include <cstring>
#include <cstdio>
#include<algorithm>
using namespace std;
int pos, ans;
struct node
{
	int num;
	int child[2];
}tree[10000010];

int add()
{
	pos++;
	tree[pos].num = 0;
	for (int i = 0; i<2; i++)
	{
		tree[pos].child[i] = -1;
	}
	return pos;
}

int inser(char* str)
{
	int post = 0;
	int tmp = 0;
	int len = strlen(str);
	for (int i = 0; i<len; i++)
	{
		int m = str[i] - '0';
		if (tree[post].child[m] == -1)
		{
			if (tmp == 0)
				tmp = i + 1;
			tree[post].child[m] = add();
		}

		post = tree[post].child[m];
		tree[post].num++;
		ans = max(ans, tree[post].num*(i + 1));
	}
	if (!tmp)
		tmp = len;
	return tmp;
}

char arr[1000010];
int main()
{
	int T;
	scanf("%d", &T);
	for (int t = 1; t <= T; t++)
	{
		int n;
		pos = 0;
		memset(tree[0].child, -1, sizeof(tree[0].child));
		scanf("%d", &n);
		ans = 0;
		for (int i = 0; i<n; i++)
		{
			scanf("%s", &arr);
			int k = inser(arr);
		}
		cout << ans << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/nameofcsdn/article/details/80420013