CSU 1981: 小M的魔術表演 1982: 小M的行動硬碟 1985: 驅R符 1987: 絢麗的手鍊
阿新 • • 發佈:2019-01-01
#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;
}
#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;
}
#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;
}
#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;
}