Petrozavodsk Summer-2017. Moscow IPT Contest
A. A Place For My Head
留坑。
B. New Divide
从高位到低位贪心,当这一位是$0$时,要尽量取$1$,维护高维后缀最小值进行判断即可。
时间复杂度$O((n+a)\log a)$。
#include<cstdio>
const int N=1000010,M=1048576;
int n,i,j,a[N],v[M];
inline void up(int&a,int b){a>b?(a=b):0;}
inline int query(int p,int w){
int x=0;
for(int i=19;~i;i--)if(!(p>>i&1))if(v[x|(1<<i)]<=w)x|=1<<i;
return (p^x)+x;
}
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&a[i]),a[i]^=a[i-1];
for(i=0;i<M;i++)v[i]=N;
for(i=n;~i;i--)v[a[i]]=i;
for(i=M-1;~i;i--)for(j=0;j<20;j++)if(!(i>>j&1))up(v[i],v[i^(1<<j)]);
for(i=1;i<=n;i++)printf("%d ",query(a[i],i));
}
C. Lying From You
留坑。
D. Don’t Stay
留坑。
E. In The End
留坑。
F. From The Inside
留坑。
G. Numb
留坑。
H. One Step Closer
留坑。
I. Invisible
给每个数一个随机的权值,那么若所有数权值的异或和不为$0$,则说明存在出现奇数次的数字。
权值线段树套线段树维护异或和,在权值线段树上往下走即可。
时间复杂度$O(n\log^2n)$。
#include<cstdio>
typedef unsigned int ll;
const int N=100010,M=40000000;
ll f[N];
int n,m,i,op,x,y,a[N];
int tot,l[M],r[M];ll v[M];
int T[300000];
void INS(int&x,int a,int b,int c,ll p){
if(!x){
x=++tot;
}
v[x]^=p;
if(a==b)return;
int mid=(a+b)>>1;
if(c<=mid)INS(l[x],a,mid,c,p);
else INS(r[x],mid+1,b,c,p);
}
void ins(int x,int a,int b,int c,int d,ll p){
INS(T[x],1,n,d,p);
if(a==b)return;
int mid=(a+b)>>1;
if(c<=mid)ins(x<<1,a,mid,c,d,p);
else ins(x<<1|1,mid+1,b,c,d,p);
}
ll ask(int x,int a,int b,int c,int d){
if(!x)return 0;
if(c<=a&&b<=d)return v[x];
int mid=(a+b)>>1;ll t=0;
if(c<=mid)t=ask(l[x],a,mid,c,d);
if(d>mid)t^=ask(r[x],mid+1,b,c,d);
return t;
}
inline int query(int c,int d){
int x=1,a=1,b=N;
while(a<b){
int mid=(a+b)>>1;
if(ask(T[x<<1],1,n,c,d)){
b=mid;
x<<=1;
}else{
a=mid+1;
x=x<<1|1;
}
}
if(!ask(T[x],1,n,c,d))return -1;
return a;
}
int main(){
for(i=1;i<N;i++)f[i]=f[i-1]*233+17;
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&a[i]),ins(1,1,N,a[i],i,f[a[i]]);
while(~scanf("%d",&m)){
if(!m)return 0;
while(m--){
scanf("%d%d%d",&op,&x,&y);
if(op==1){
ins(1,1,N,a[x],x,f[a[x]]);
a[x]=y;
ins(1,1,N,a[x],x,f[a[x]]);
}else{
printf("%d\n",query(x,y));
fflush(stdout);
}
}
}
}
J. Leave Out All The Rest
两边的LIS都可以取到。
#include<cstdio>
const int N=1000010;
int n,m,i,j,x,a[N],b[N],cnt,c[N],ans;
inline void add(int x){
if(x>c[cnt]){c[++cnt]=x;return;}
int l=1,r=cnt,mid,t;
while(l<=r)if(c[mid=(l+r)>>1]>=x)r=(t=mid)-1;else l=mid+1;
c[t]=x;
}
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&x),add(x);
ans=cnt;
cnt=0;
scanf("%d",&m);
for(i=1;i<=m;i++)scanf("%d",&x),add(x);
printf("%d",cnt+ans);
}
K. Faint
找规律发现每个数的贡献和组合数有关。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x, y) memset(x, y, sizeof(x))
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b > a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b < a)a = b; }
const int N = 1e5 + 10, M = 1e5 + 10, Z = 1e9 + 7, inf = 0x3f3f3f3f;
template <class T1, class T2>inline void gadd(T1 &a, T2 b) { a = (a + b) % Z; }
const int LIM=3000000;
int casenum, casei;
LL n, K, m;
LL fac[LIM],inv[LIM];
int c(int n, int m)
{
if(n<m)return 0;
return fac[n]*inv[m]%Z*inv[n-m]%Z;
//LL rtn = 1;
//for(int i = m + 1; i <= n; ++i)rtn *= i;
//for(int i = 1; i <= n - m; ++i)rtn /= i;
//return rtn;
}
int main()
{
int i;
for(fac[0]=i=1;i<LIM;i++)fac[i]=1LL*fac[i-1]*i%Z;
for(inv[0]=inv[1]=1,i=2;i<LIM;i++)inv[i]=1LL*(Z-inv[Z%i])*(Z/i)%Z;
for(i=2;i<LIM;i++)inv[i]=1LL*inv[i-1]*inv[i]%Z;
while(~scanf("%lld%lld%lld", &n, &K, &m))
{
if(m == 1)
{
printf("%d\n", n - K);
continue;
}
int sum = 0;
int val = 0;
for(int i = 1; i <= n - K; ++i)
{
int num = c(i - 1 + m - 2, i - 1);
sum += num;
sum%=Z;
val += 1LL*num * i%Z;
val%=Z;
} int top = 1LL*sum * (n - K + 1)%Z;
int bot = val;
//printf("%d\n", top); printf("%d\n", bot);
LL ans = 1LL*(top - bot) * 2 - (n - K);
printf("%lld\n", (ans%Z+Z)%Z);
}
return 0;
}
/*
【trick&&吐槽】 【题意】 【分析】 【时间复杂度&&优化】 */
Petrozavodsk Summer-2017. Moscow IPT Contest的更多相关文章
- 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】
FFF at Valentine Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 2017 Multi-University Training Contest - Team 9 1004&&HDU 6164 Dying Light【数学+模拟】
Dying Light Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- 2017 Multi-University Training Contest - Team 9 1003&&HDU 6163 CSGO【计算几何】
CSGO Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- 2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】
Ch’s gift Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- 2017 Multi-University Training Contest - Team 9 1001&&HDU 6161 Big binary tree【树形dp+hash】
Big binary tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1003&&HDU 6035 Colorful Tree【树形dp】
Colorful Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】
Function Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- 2017 Multi-University Training Contest - Team 1 1002&&HDU 6034 Balala Power!【字符串,贪心+排序】
Balala Power! Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1011&&HDU 6043 KazaQ's Socks【规律题,数学,水】
KazaQ's Socks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
随机推荐
- Groovy 设计模式 -- 适配器模式
Adapter Pattern http://groovy-lang.org/design-patterns.html#_adapter_pattern 适配器模式,对象存在一个接口, 此接口在此对象 ...
- burp suite 基础入门超详细教程
介绍: 都是我个人了解到的信息,,分享给大家 欢迎指正 burp suite 被誉为web安全工具中的瑞士军刀. 大家知道,瑞士军刀,都是体积小,功能强悍,.西方军队的标配.说这么多,只是想强调这款工 ...
- HEAD FILE
心血来潮做的沙雕Head,喜欢就拿去用吧,Explosion! HEAD //#pragma comment(linker, "/STACK:1024000000,1024000000&qu ...
- (三)微信小程序首页的分类功能和搜索功能的实现笔记
就在昨天,微信宣布了微信小程序开发者工具新增“云开发”功能 下载最新的开发者工具,现在无需服务器即可实现小程序的快速迭代! 分类功能和搜索功能的效果图 1.首页分类功能的实现 boxtwo方法(.js ...
- 忘记mysql的登陆密码该怎么办?
1.如果忘记了其他用户的密码,可以使用root账户进入mysql,修改mysql.user表中的用户密码 2.如果忘记了root的mysql密码,可以使用如下方式: 确认服务器处于安全的状态,也就是没 ...
- PHP 【四】
数组 $string = array(x,y,z); <?php$cars=array("Volvo","BMW","Toyota") ...
- [Harbor]Harbor简要介绍
前一段时间写过一篇文章:[Kubernetes]CentOS7下搭建Harbor仓库,只是知道了如何搭建,但是对于背后的整体架构还不是太清楚,这篇文章就来讲讲. 默认情况下,Harbor运行起来后有如 ...
- windows每天备份文件的bat脚本【原创】
备份昨天文件的脚本 @echo off set yy=%DATE:~,% set mm=%DATE:~,% set ,% ::前一天的日期,格式化输出 ,date)>vbs.vbs for /f ...
- Jmeter学习笔记03-元件作用域及执行顺序
Jmeter可以通过鼠标拖拽来随意改变元件之间的顺序以及元件的层级关系,随着元件所在域的不同,在执行时候,会有不同效果 层级关系和元件类型决定了在测试计划中各元件的执行顺序. 1)元件的作用域: jm ...
- 命令操作MySQL数据库
一.连接MYSQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1. 连接到本机上的MYSQL. 首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u roo ...