Gym.101955: Asia Shenyang Regional Contest(寒假自训第10场)
C.Insertion Sort
题意:Q次询问,每次给出N,M,Mod,问你有多少种排列,满足前面M个数字排序之后整个序列的LIS>=N-1。
思路:我们把数字看成[1,M],[N-M+1,N]两个部分,假设是A和B。分几种情况即可。
我发现我好像想错了。 https://blog.csdn.net/qq_23502651/article/details/84680151
另外:长度为N的排列的LIS为N-1的个数=(N-1)^2; 可以推出这个公式。F(i)=F(i-1)+i-1; F(2)=1; F(3)=F(2)+2...就有了.
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int main()
{
ll T,N,M,C=,Mod,ans;
scanf("%lld",&T);
while(T--){
scanf("%lld%lld%lld",&N,&M,&Mod);
if(M>=N-){
ans=;
rep(i,,N) ans=(ll)ans*i%Mod;
}
else {
ans=; ll t=((N-M)*(N-M-)+M*(N-M)+)%Mod;
rep(i,,M) ans=(ll)ans*i%Mod;
ans=(ll)ans*t%Mod;
}
printf("Case #%lld: %lld\n",++C,ans);
}
return ;
}
E .The Kouga Ninja Scrolls
题意:二维平面上有一些点,现在又几种操作,修改点的位置,修改点的颜色。 询问区间异色的点在最远曼哈顿距离。
思路:最远曼哈顿距离,想到转化为切比雪夫距离,然后线段树。以为要维护最大次大,最小次小,x,y; 感觉太多太长没敢写。
我们可以不转化为切比雪夫,直接用之前的k维最远距离,建立2^k棵线段树。 这样的好处是。 一个区间的最小值,等效与补值对应的线段树的最大值的相反数。
这样我们就没必要维护最小次小了,代码会好看一点。
本题收获:最大和最小值,我们可以统一; 在合并的情况比较多的时候,开一些全局变量,然后减少情况讨论。 比如query的时候,直接与全局变量的res更新答案。
好麻烦啊。。。估计转化维切比雪夫的代码会很长。
#include<bits/stdc++.h>
#define ll long long
#define f first
#define s second
#define pii pair<ll,ll>
#define rep(i,w,v) for(int i=w;i<=v;i++)
using namespace std;
const int maxn=;
const ll inf=(1LL<<);
ll x[maxn],y[maxn],a[maxn][];int c[maxn];
pii res[][];
struct in{
pii Mx[maxn<<][]; int idx;
void pushup(int Now)
{
if(Mx[Now<<][].s!=Mx[Now<<|][].s){
if(Mx[Now<<][].f>Mx[Now<<|][].f){
Mx[Now][]=Mx[Now<<][];
Mx[Now][]=max(Mx[Now<<][],Mx[Now<<|][]);
}
else {
Mx[Now][]=Mx[Now<<|][];
Mx[Now][]=max(Mx[Now<<|][],Mx[Now<<][]);
}
}
else {
rep(i,,)
Mx[Now][i]=max(Mx[Now<<][i],Mx[Now<<|][i]);
}
}
void build(int Now,int L,int R)
{
if(L==R){
Mx[Now][].f=a[L][idx]; Mx[Now][].s=c[L];
Mx[Now][].f=-inf; Mx[Now][].s=-;
return ;
}
int Mid=(L+R)>>;
build(Now<<,L,Mid);
build(Now<<|,Mid+,R);
pushup(Now);
}
void update(int Now,int L,int R,int pos)
{
if(L==R){
Mx[Now][].f=a[L][idx]; Mx[Now][].s=c[L];
Mx[Now][].f=-inf; Mx[Now][].s=-;
return ;
}
int Mid=(L+R)>>;
if(pos<=Mid) update(Now<<,L,Mid,pos);
else update(Now<<|,Mid+,R,pos);
pushup(Now);
}
void query(int Now,int L,int R,int l,int r)
{
if(l<=L&&r>=R){
if(Mx[Now][].s!=res[idx][].s){
if(Mx[Now][].f>res[idx][].f){
res[idx][]=max(res[idx][],Mx[Now][]);
res[idx][]=Mx[Now][];
}
else {
res[idx][]=max(res[idx][],Mx[Now][]);
}
}
else {
rep(i,,)
res[idx][i]=max(res[idx][i],Mx[Now][i]);
}
return ;
}
int Mid=(L+R)>>;
if(l<=Mid) query(Now<<,L,Mid,l,r);
if(r>Mid) query(Now<<|,Mid+,R,l,r);
}
}T[];
int main()
{
int Cas,N,M,Fcy=,opt,L,R,K,C;ll X,Y;
scanf("%d",&Cas); rep(i,,) T[i].idx=i;
while(Cas--){
scanf("%d%d",&N,&M);
rep(i,,N) scanf("%I64d%I64d%I64d",&x[i],&y[i],&c[i]);
rep(i,,N) {
a[i][]=x[i]+y[i];
a[i][]=x[i]-y[i];
a[i][]=-x[i]+y[i];
a[i][]=-x[i]-y[i];
}
rep(i,,) T[i].build(,,N);
printf("Case #%d:\n",++Fcy);
while(M--){
scanf("%d",&opt);
if(opt==){
scanf("%d%I64d%I64d",&K,&X,&Y);
x[K]+=X; y[K]+=Y;
a[K][]=x[K]+y[K];
a[K][]=x[K]-y[K];
a[K][]=-x[K]+y[K];
a[K][]=-x[K]-y[K];
rep(j,,) T[j].update(,,N,K);
}
else if(opt==){
scanf("%d%d",&K,&C); c[K]=C;
rep(i,,) T[i].update(,,N,K);
}
else {
scanf("%d%d",&L,&R);
rep(i,,) {
res[i][].f=res[i][].f=-inf;//mp(-inf,-1);
res[i][].s=res[i][].s=-;
}
rep(i,,) T[i].query(,,N,L,R);
ll ans=;
rep(i,,) {
if(res[i][].s!=res[-i][].s) ans=max(ans,res[i][].f+res[-i][].f);
else {
ans=max(ans,res[i][].f+res[-i][].f);
ans=max(ans,res[i][].f+res[-i][].f);
}
}
printf("%I64d\n",ans);
}
}
}
return ;
}
G .Best ACMer Solves the Hardest Problem
题意:在二维平面上四种操作: 1,加一个带权的点; 2,删去一个点; 3,给一个点周围欧几里得距离为sqrt(k)的存在的点点权都加w; 4,查询一个到点欧几里得距离为sqrtk的点权和。
思路:发现到一个点的欧几里得距离为k的点并不多。所以我们暴力即可。 注意用 ll。
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define mp make_pair
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxm=;
const int maxn=;
ll a[maxn][maxn];int vis[maxn][maxn],Ca,tot;
vector<pii>G[maxm+];
void init()
{
rep(i,,){
rep(j,,){
if(i*i+j*j>maxm) break;
G[i*i+j*j].push_back(mp(i,j));
tot++;
}
}
}
void add(int x,int y,int w)
{
if(vis[x][y]!=Ca) a[x][y]=,vis[x][y]=Ca;
a[x][y]+=w;
}
void del(int x,int y)
{
vis[x][y]=; a[x][y]=;
}
void FCY(int x,int y,int w)
{
if(x<||x>||y<||y>) return ;
if(vis[x][y]==Ca) a[x][y]+=w;
}
int query(int x,int y)
{
if(x<||x>||y<||y>) return ;
if(vis[x][y]==Ca) return a[x][y];
return ;
}
void ADD(int x,int y,int k,int w)
{
for(int i=;i<G[k].size();i++){
int dx=G[k][i].first,dy=G[k][i].second;
FCY(x+dx,y+dy,w);
if(dx!=) FCY(x-dx,y+dy,w);
if(dy!=) FCY(x+dx,y-dy,w);
if(dx!=&&dy!=) FCY(x-dx,y-dy,w);
}
}
ll Query(int x,int y,int k)
{
ll res=;
for(int i=;i<G[k].size();i++){
int dx=G[k][i].first,dy=G[k][i].second;
res+=query(x+dx,y+dy);
if(dx!=) res+=query(x-dx,y+dy);
if(dy!=) res+=query(x+dx,y-dy);
if(dx!=&&dy!=) res+=query(x-dx,y-dy);
} return res;
}
int main()
{
int T,N,M,x,y,w,k,opt;ll ans;
init();
scanf("%d",&T);
while(T--){
scanf("%d%d",&N,&M); Ca++; ans=;
printf("Case #%d:\n",Ca);
rep(i,,N){
scanf("%d%d%d",&x,&y,&w);
add(x,y,w);
}
rep(i,,M){
scanf("%d%d%d",&opt,&x,&y);
x=(x+ans)%+; y=(y+ans)%+;
if(opt==){
scanf("%d",&w);
add(x,y,w);
}
else if(opt==){
del(x,y);
}
else if(opt==){
scanf("%d%d",&k,&w);
ADD(x,y,k,w);
}
else {
scanf("%d",&k);
printf("%lld\n",ans=Query(x,y,k));
}
}
}
return ;
}
K .Let the Flames Begin
题意:约瑟夫问题,给定N,K,M,问第M个出来的人的编号是。 K或者M<1e6;
思路:只要知道公式就大概知道怎么做的题。
我们知道第N个人出来的编号公式是: p=0 ; rep(i,1,N) p=(p+k)%i; ans=p;(假设从0开始)
而第M个出来的人的编号,我们可以假设已经进行了N-M轮,但其实我们并不关心他们的位置,我可以做完之后把他们放到对应位置即可。
所以第M个人的编号是:p=0;rep(i,1,M) p=(p+k)%(i+N-M);
当M比较小时,可以直接求; 当K比较小时,我们可以利用整除合并的思想做。
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(ll i=a;i<=b;i++)
using namespace std;
ll solve(ll N,ll M,ll K) //N个人,每K个skip一次,第M次skip的是谁
{
if(K==) return M; ll p=;
if(M<=K){
rep(i,,M){
p=(p+K-)%(i+N-M)+;
}
}
else {
ll tM=M;
rep(i,,M){
if(!tM) break;
if(p+K->=i+N-M) tM--,p=(p+K-)%(i+N-M)+;//,cout<<i<<":"<<p<<endl;
else {
//p+kx-1<i+x-1+N-M -> x<(i-1+N-M-p)/(k-1);
ll t=(i+N-M-p)/(K-),g;
if((i+N-M-p)%(K-)==) t--;
g=min(t,tM);
p=p+K*g; tM-=g;
i=i+g-;
}
}
}
return p;
}
int main()
{
int T,Ca=; ll N,M,K;
scanf("%d",&T);
while(T--){
scanf("%lld%lld%lld",&N,&M,&K);
printf("Case #%d: %lld\n",++Ca,solve(N,M,K));
}
return ;
}
J .How Much Memory Your Code Is Using?
题意:开了一些变量,问你用了多少内存。
思路:模拟即可。
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int mod=1e9+;
char c[],a[]={'l','o','n','g',' ','l','o','n','g'};
char b[]={'l','o','n','g',' ','d','o','u','b','l','e'};
ll sum=; int L;
bool check1()
{
bool F=true;
if(L<) return false;
rep(i,,) if(c[i]!=a[i]) return false;
return true;
}
bool check2()
{
bool F=true;
if(L<) return false;
rep(i,,) if(c[i]!=b[i]) return false;
return true;
}
void solve()
{
ll tmp; L=strlen(c);
if(c[]=='b'||c[]=='c') tmp=;
if(c[]=='i'||c[]=='f') tmp=;
if(check1()||c[]=='d') tmp=;
if(c[]=='_'||check2()) tmp=;
rep(i,,L-){
if(c[i]=='['){
int k=;
rep(j,i+,L-) if(c[j]>=''&&c[j]<='') k=k*+c[j]-'';
tmp*=k;
break;
}
}
sum+=tmp;
}
int main()
{
int T,N,Ca=;
scanf("%d",&T);
while(T--){
scanf("%d\n",&N); sum=;
rep(i,,N){
gets(c);
solve();
}
ll F=sum/; if(sum%) F++;
printf("Case #%d: %lld\n",++Ca,F);
}
return ;
}
Gym.101955: Asia Shenyang Regional Contest(寒假自训第10场)的更多相关文章
- Gym101986: Asia Tsukuba Regional Contest(寒假自训第12场)
A .Secret of Chocolate Poles 题意:有黑白两种木块,黑色有1,K两种长度: 白色只有1一种长度,问满足黑白黑...白黑形式,长度为L的组合种类. 思路:直接DP即可. #i ...
- Gym102040 .Asia Dhaka Regional Contest(寒假自训第9场)
B .Counting Inversion 题意:给定L,R,求这个区间的逆序对数之和.(L,R<1e15) 思路:一看这个范围就知道是数位DP. 只是维护的东西稍微多一点,需要记录后面的各种数 ...
- Gym.102006:Syrian Collegiate Programming Contest(寒假自训第11场)
学习了“叙利亚”这个单词:比较温和的一场:几何的板子eps太小了,坑了几发. A .Hello SCPC 2018! 题意:给定一个排列,问它是否满足,前面4个是有序的,而且前面4个比后面的都小. 思 ...
- Gym.101908 Brazil Subregional Programming Contest(寒假自训第六场)
这几天睡眠时间都不太够,室友晚上太会折腾了,感觉有点累,所以昨天的题解也没写,看晚上能不能补起来. B . Marbles 题意:给定N组数(xi,yi),玩家轮流操作,每次玩家可以选择其中一组对其操 ...
- The 2016 ACM-ICPC Asia Shenyang Regional Contest
A. Thickest Burger 大数 × 2 + 小数 #include <cstdio> #include <algorithm> using namespace st ...
- The 2017 ACM-ICPC Asia Shenyang Regional Contest
传送门 F - Heron and His Triangle 直接打表找到规律\(f_i=4f_{i-1}+f_{i-2}\),然后大数预处理一下,对于询问直接输出就行. Code #include ...
- zoj 3659 Conquer a New Region The 2012 ACM-ICPC Asia Changchun Regional Contest
Conquer a New Region Time Limit: 5 Seconds Memory Limit: 32768 KB The wheel of the history roll ...
- 2018 ACM-ICPC Asia Beijing Regional Contest (部分题解)
摘要 本文主要给出了2018 ACM-ICPC Asia Beijing Regional Contest的部分题解,意即熟悉区域赛题型,保持比赛感觉. Jin Yong’s Wukong Ranki ...
- 2014-2015 ACM-ICPC, Asia Xian Regional Contest(部分题解)
摘要 本文主要给出了2014-2015 ACM-ICPC, Asia Xian Regional Contest的部分题解,说明了每题的题意.解题思路和代码实现,意即熟悉区域赛比赛题型. Built ...
随机推荐
- SourceInsight 4重启之后文件变只读无法编辑
SourceInsight4.0在导入代码后,用起来没问题,第二天,再开启sourceInsight,结果所有文件变成只读了,不能编辑,标签前面也有了叹号. 百度一下,有人说是版本控制的问题,但是sv ...
- Apache升级PHP教程(以5.3.3升级到5.6.30为例)
最简单的LAMP环境搭建当然是通过yum来安装,但由于镜像仓库中的软件版本更新较慢,经常会遇到版本过旧的问题,尤其是安装一些新版本的CMS时的PHP. 这时我们需要手动编译PHP,Linux编译安装经 ...
- QWebView崩溃的问题
http://www.cnblogs.com/kobe-echo/p/5720765.html#undefined
- linux下正则表达式学习
下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为: 字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 向后引用.或一个八进制转义符.例如,'n' 匹配字符 " ...
- shell 通配符
Bash中的通配符 '?' 匹配一个任意字符 '*' 匹配0个或任意多个字符,也就是可以匹配任何内容 '[]' 匹配括号中任意一个字符.例如[abc]代表一定匹配一个字符,或者是a,或者是b,或者是c ...
- Asp.Net 中 HTTP 和 HTTPS 切换
Asp.Net 中 HTTP 和 HTTPS 切换 目的 HTTP,超文本传输协议,明文传输,无状态,服务器默认端口80 HTTPS,具有SSL加密的HTTP,加密传输,需要申请ca证书,服务器默 ...
- mybatis generator工具的使用
mybatis反转数据库的配置文件: generatorConfig.xml: <?xml version="1.0" encoding="UTF-8"? ...
- ppt点击文字出现图片,再次点击消失
实现效果:在PPT一个页面的任意位置,单击左键,出现图片:在图片上,单击左键,图片消失 实现思路:给图片做两个动画,一个进入,文字作触发器,另一个退出,图片本身为触发器. 实现方法: 1.选中图片…… ...
- vue引用样式
cnpm i sass-loader node-sass -D <link rel="stylesheet" href="./static/reset.css&qu ...
- word-wrap与break-word属性的区别
共同点 word-wrap:break-word与word-break:break-all都能把长单词强行断句 不同点 word-wrap:break-word会首先起一个新行来放置长单词,新的行还是 ...