@baobaobear
2020-03-29T10:50:15.000000Z
字数 9852
阅读 235
contest
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100010;
int main()
{
int n;
while(cin >> n)
{
int k=sqrt(n);
if(k*k==n)cout << 1 << endl;
else cout << 0 << endl;
}
return 0;
}
#include <iostream>
using namespace std;
int n, a[200010];
int main() {
cin >> n;
int now = 1;
if(!(n & 1)) {
puts("NO");
return 0;
}
for(int i = 1; i <= n * 2; i += 2) {
a[now] = i;
if(now <= n) {
a[now + n] = i + 1;
now = now + n + 1;
}
else {
a[now - n] = i + 1;
now = now - n + 1;
}
}
puts("YES");
for(int i = 1; i <= n * 2; ++i)
cout << a[i] << ' ';
return 0;
}
#include <iostream>
#define int long long
using namespace std;
signed main() {
int t;
cin >> t;
while(t--) {
int x;
cin >> x;
cout << x * (9 * x - 7) / 2 + 1 << endl;
}
return 0;
}
import java.util.Scanner;
public class Main
{
public static void main(String args[]) throws Exception
{
Scanner cin=new Scanner(System.in);
int n,k;
long r,s,p,sum=0;
String str;
char ch[]=new char[200050];
n=cin.nextInt();
k=cin.nextInt();
r=cin.nextInt();
s=cin.nextInt();
p=cin.nextInt();
str=cin.next();
cin.close();
for(int i=0; i<k; ++i) {
if(str.charAt(i)=='r') {
sum+=p;
ch[i]='p';
}
if(str.charAt(i)=='s') {
sum+=r;
ch[i]='r';
}
if(str.charAt(i)=='p') {
sum+=s;
ch[i]='s';
}
}
for(int i=k; i<n-k; ++i) {
if(str.charAt(i)=='r') {
if(ch[i-k]=='p') {
if(str.charAt(i+k)=='s')
ch[i]='s';
if(str.charAt(i+k)=='r')
ch[i]='r';
if(str.charAt(i+k)=='p')
ch[i]='r';
}
else {
sum+=p;
ch[i]='p';
}
}
if(str.charAt(i)=='s') {
if(ch[i-k]=='r') {
if(str.charAt(i+k)=='s')
ch[i]='s';
if(str.charAt(i+k)=='r')
ch[i]='s';
if(str.charAt(i+k)=='p')
ch[i]='p';
}
else {
sum+=r;
ch[i]='r';
}
}
if(str.charAt(i)=='p') {
if(ch[i-k]=='s') {
if(str.charAt(i+k)=='s')
ch[i]='p';
if(str.charAt(i+k)=='r')
ch[i]='r';
if(str.charAt(i+k)=='p')
ch[i]='r';
}
else {
sum+=s;
ch[i]='s';
}
}
}
int pppp;
if(n-k<k)pppp=k;
else pppp=n-k;
for(int i=pppp; i<n; ++i) {
if(str.charAt(i)=='r') {
if(i-k<0)
sum+=p;
else if(ch[i-k]!='p')
sum+=p;
}
if(str.charAt(i)=='s') {
if(i-k<0)
sum+=r;
else if(ch[i-k]!='r')
sum+=r;
}
if(str.charAt(i)=='p') {
if(i-k<0)
sum+=s;
else if(ch[i-k]!='s')
sum+=s;
}
}
System.out.println(sum);
}
}
import java.util.Arrays;
import java.util.Scanner;
public class Main
{
public static void main(String args[]) throws Exception
{
Scanner cin=new Scanner(System.in);
int n,midmid,ll,rr;
long sum,l,r,mid,k;
n=cin.nextInt();
k=cin.nextLong();
long arr[]=new long[n];
for(int i=0; i<n; ++i) {
arr[i]=cin.nextLong();
}
Arrays.sort(arr);
if(arr[0]<=0&&arr[n-1]<=0) {
//l=arr[n-1]*arr[n-2];
//r=arr[0]*arr[1];
l=-1;r=1;
for(int i=0; i<18; ++i) {
l*=(long)10;
r*=(long)10;
}
--l;++r;
--l;++r;
--l;++r;
}
else if(arr[0]>=0&&arr[n-1]>=0) {
//l=arr[0]*arr[1];
//r=arr[n-1]*arr[n-2];
l=-1;r=1;
for(int i=0; i<18; ++i) {
l*=(long)10;
r*=(long)10;
}
--l;++r;
--l;++r;
--l;++r;
}
else {
l=-1;r=1;
for(int i=0; i<18; ++i) {
l*=(long)10;
r*=(long)10;
}
--l;++r;
--l;++r;
--l;++r;
}
while(true) {
if(r-l<=1)
break;
mid=(l+r)/2;
sum=0;
for(int i=0; i<n; ++i) {
ll=i;
rr=n;
if(arr[i]<0){
while(rr-ll>1){
midmid=(ll+rr)/2;
if(arr[i]*arr[midmid]<=mid)
rr=midmid;
else
ll=midmid;
}
sum=sum+(long)(n-rr);
}
else {
while(rr-ll>1){
midmid=(ll+rr)/2;
if(arr[i]*arr[midmid]<=mid)
ll=midmid;
else
rr=midmid;
}
sum=sum+(long)(ll-i);
}
}
if(sum<k)
l=mid;
else
r=mid;
}
System.out.println(r);
cin.close();
}
}
#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <iostream>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof (a))
#define gcd(a,b) __gcd(a,b)
#define all(a) a.begin(),a.end()
#define in(a) insert(a)
#define sz() size()
#define endl '\n'
#define pb push_back
typedef unsigned long long ll;
const int maxn=100010;
const int inf=1e9;
const ll mod=998244353;
const double pi=3.14159265358979;
const double ep=0.0;
using namespace std;
int main()
{
string s;
int k,ans=0;
cin>>s>>k;
int n=s.sz();
if (n>1)
{
if (k==1)
ans+=(n-1)*9;
else if (k==2)
ans+=(n-1)*(n-2)/2*9*9;
else
ans+=(n-1)*(n-2)*(n-3)/6*9*9*9;
}
if (k==1)
ans+=s[0]-'0';
if (k==2)
{
ans+=(s[0]-'1')*(n-1)*9;
s.erase(0,1);
n--;
while (s[0]=='0')
{
s.erase(0,1);
n--;
}
if (n>=1)
{
ans+=(n-1)*9;
ans+=(s[0]-'0');
}
}
if (k==3)
{
ans+=(s[0]-'1')*(n-1)*(n-2)/2*9*9;
s.erase(0,1);
n--;
while (s[0]=='0')
{
s.erase(0,1);
n--;
}
if (n>1)
{
ans+=(n-1)*(n-2)/2*9*9;
ans+=(s[0]-'1')*(n-1)*9;
s.erase(0,1);
n--;
while (s[0]=='0')
{
s.erase(0,1);
n--;
}
if (n>=1)
{
ans+=(n-1)*9;
ans+=(s[0]-'0');
}
}
}
cout<<ans<<endl;
return 0;
}
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);
#define ll long long
#define INF 0x3f3f3f3f
#define MEM(x,y) memset(x,y,sizeof(x))
#define int long long
#define rep(i , a , b) for(int i = a ; i <= b ; i ++)
#define P pair<int,int>
#define sc(a) scanf("%lld",&a)
#define pf(a) printf("%lld ",a)
using namespace std;
const int maxn = 1 << 16;
struct node
{
int p1;
int d1;
bool operator<(const struct node& a1)const
{
return d1 > a1.d1;
}
};
int du[16];
int eg[16][16];
int d[maxn];
bool vis[maxn];
int n, m, s, ed, fir;
void dijkstra()
{
priority_queue<node> que;
for (int i = 0; i < (1<<n); i++)
{
d[i] = -1;
vis[i] = false;
}
d[s] = fir;
node n1;
n1.p1 = s;
n1.d1 = d[s];
que.push(n1);
while (!que.empty())
{
node ans = que.top();
que.pop();
int u = ans.p1;
if (vis[u]) continue;
vis[u] = true;
if (u == ed) break;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < i; j++)
{
if (eg[i][j] != -1)
{
int v = u ^ (1 << i);
v = v ^ (1 << j);
if (d[v] == -1 || d[u] + eg[i][j] < d[v])
{
d[v] = d[u] + eg[i][j];
node n2;
n1.p1 = v;
n1.d1 = d[v];
que.push(n1);
}
}
}
}
}
}
signed main()
{
while (scanf("%d", &n) != EOF && n)
{
sc(m);
rep(i, 0, n - 1)
{
du[i] = 0;
rep(j, 0, n - 1)
eg[i][j] = -1;
}
fir = 0;
int q, w, e;
rep(i, 0, m - 1)
{
cin >> q >> w >> e;
du[q]++;
du[w]++;
fir += e;
if (eg[q][w] == -1 || eg[q][w] > e)
eg[q][w] = eg[w][q] = e;
}
s = 0;
rep(i, 0, n - 1)
{
ed = ed | (1 << i);
if (du[i] % 2 == 0)
s = s | (1 << i);
}
dijkstra();
cout << d[ed] << endl;
}
return 0;
}
/**
* ┏┓ ┏┓
* ┏┛┗━━━━━━━┛┗━━━┓
* ┃ ┃
* ┃ ━ ┃
* ┃ > < ┃
* ┃ ┃
* ┃... ⌒ ... ┃
* ┃ ┃
* ┗━┓ ┏━┛
* ┃ ┃ Code is far away from bug with the animal protecting
* ┃ ┃ 神兽保佑,代码无bug
* ┃ ┃
* ┃ ┃
* ┃ ┃
* ┃ ┃
* ┃ ┗━━━┓
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━━━━━━━━┳┓┏┛
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<set>
#include<bitset>
#include<complex>
#include<assert.h>
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,l,r) for(int i=l;i>=r;i--)
#define link(x) for(edge *j=h[x];j;j=j->next)
#define mem(a) memset(a,0,sizeof(a))
#define ll long long
#define eps 1e-8
#define succ(x) (1<<x)
#define mid (x+y>>1)
#define lowbit(x) (x&(-x))
#define sqr(x) (1ll*(x)*(x))
#define NM 100005
#define nm 200005
using namespace std;
const double pi=acos(-1);
const int inf=2e9+7;
ll read(){
ll x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return f*x;
}
int n,a[NM],c[NM],s;
int main(){
n=read();
inc(i,1,n)scanf("%1d",a+i);
c[n+1]=n+1;
dec(i,n,1)if(a[i]==1)c[i]=c[i+1];else c[i]=i;
inc(i,1,n){
int t=1;
inc(j,i,n){
t=t*a[j];
if(t>n)break;
if(c[j+1]-i+1>t&&j-i+1<=t)s++;
j=c[j+1]-1;
}
}
printf("%d\n",s);
return 0;
}
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int n;
long long s, r;
int main ( void )
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
vector < long long > a ( n );
for ( int i = 0 ; i < n ; i++ ) {
cin >> a [ i ];
s ^= a [ i ];
} //前缀
int number = 0;
for ( int k = 60 - 1 ; k >= 0 ; k--) {
long long l = 1LL << k; //long long int
if ( s & l ) continue;//比较i位上面的为1的是奇数还是偶数,奇数忽略,因为无论怎么划分两部分异或和在i位上都是一个1一个0
for ( int i = number ; i < n; i++ ) {
if ( a [ i ] & l ) { //考虑偶数个1位如何构造最大,高位比低位重要
long long t = a [ i ];
for ( int j = i + 1 ; j < n ; j++ ) {
if ( a [ j ] & l ) {
a [ j ] ^= t;
}
}
swap ( a [ number++ ] , a [ i ] );//a [ i ]用过了
if ( !( r & l ) ) r ^= t;
break;
}
}
}
//r构造了一个能为1就为1的数
s = r ^ s;
r = s + r;
cout << r << endl;
return 0;
}
#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <iostream>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof (a))
#define gcd(a,b) __gcd(a,b)
#define all(a) a.begin(),a.end()
#define in(a) insert(a)
#define sz() size()
#define endl '\n'
#define pb push_back
using namespace std;
typedef unsigned long long ll;
const int maxn=100010;
const int inf=1e9;
const ll mod=998244353;
const double pi=3.14159265358979;
const double ep=0.0;
struct A{
int l,r;
ll hashs;
}tree[4*maxn];
string ss;
ll hh[maxn];
ll chash()
{
ll s=0;
for(int i=ss.sz()-1;i>=0;i--)
s=s*31+ss[i]-'a'+1;
return s;
}
void build(int L,int R,int id)
{
tree[id].l=L;
tree[id].r=R;
if(L==R)
{
tree[id].hashs=ss[L]-'a'+1;
return;
}
int mid=(L+R)>>1;
build(L,mid,id<<1);
build(mid+1,R,id<<1|1);
tree[id].hashs=tree[id<<1].hashs+tree[id<<1|1].hashs*hh[mid+1-L];
}
void update(int l,int id)
{
if(tree[id].l==tree[id].r)
{
tree[id].hashs=ss[l]-'a'+1;
return;
}
int mid=(tree[id].l+tree[id].r)>>1;
if(l<=mid)
update(l,id<<1);
else
update(l,id<<1|1);
tree[id].hashs=tree[id<<1].hashs+tree[id<<1|1].hashs*hh[mid+1-tree[id].l];
}
ll query(int L,int R,int id)
{
if(tree[id].l>=L&&tree[id].r<=R)
return tree[id].hashs;
int mid=(tree[id].l+tree[id].r)>>1;
if(R<=mid)
return query(L,R,id<<1);
else if(L>mid)
return query(L,R,id<<1|1);
return query(L,mid,id<<1)+query(mid+1,R,id<<1|1)*hh[mid+1-L];
}
int main()
{
map<ll,int>mp;
hh[0]=1;
for(int i=1;i<=maxn;i++)
hh[i]=hh[i-1]*31;
int t,k=1;
scanf("%d",&t);
while (t--)
{
printf("Case #%d:\n",k++);
int n;
scanf("%d",&n);
mp.clear();
for(int i=1;i<=n;i++)
{
cin>>ss;
mp.in(make_pair(chash(),1));
}
cin>>ss;
build(0,ss.sz()-1,1);
int q;
scanf("%d",&q);
while (q--)
{
int x;
char c;
cin>>c;
if(c=='C')
{
cin>>x>>c;
ss[x]=c;
update(x,1);
}
else
{
int l,r;
cin>>l>>r;
if(mp.find(query(l,r,1))!=mp.end())
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}
}
return 0;
}
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 200010;
int n , a , b , c , front , behind;
long long ans;
int f [ maxn ] [ 2 ] , number_1 [ maxn ] , number_2 [ maxn ]; //一个维护边权为1,一个维护边权为0
int find ( int x , int y ) {
if ( !f [ x ] [ y ] ) {
return x;
} else {
f [ x ] [ y ] = find ( f [ x ] [ y ] , y );
return f [ x ] [ y ];
}
}
int main ( void ) {
scanf ( "%d" , &n );
for ( int i = 1 ; i < n ; i++ ) {
scanf ( "%d %d %d" , &a , &b , &c );
front = find ( a , c );
behind = find ( b , c );//往前往后找联通的(其实就是两个方向搜)
if ( front != behind ) {
f [ front ] [ c ] = behind;
}
}
for ( int i = 1 ; i <= n ; i++ ) { //这里把自己也算上了
number_1 [ find ( i , 1 ) ]++;
number_2 [ find ( i , 0 ) ]++;
}
for ( int i = 1 ; i <= n ; i++ ) {
//这里算了两部分,只有边权为1,只有边权为0,从0到1,只有边权为0和只有边权为1的,都是结点*(结点-1),如果是
//联通的,就乘起来
//要注意的问题是比如:
/*
数据:
6
1 2 1
2 3 1
3 4 1
4 5 0
5 6 0
4是联通边权为1和边权为0的,在计算时把自己到自己的排除了,每一次计算都是如此,所以要减去1
*/
ans += 1ll * ( number_1 [ find ( i , 1 ) ] ) * ( number_2 [ find ( i , 0 ) ] ) - 1;
}
printf ( "%lld\n" , ans );
return 0;
}