这次考试T1想到了正解没有去实现,然后就死了,不过我估计就算想到正解也会挂(26^2和暴力一个分),肝了两个小时T2屁都没蹦出来,T3没有搞清那个式子的含义。

(不过一分没挂)

T1:string

开26棵线段树维护,还有一种更快的方法:对于每个树上的节点,只有左右儿子字符相同时才更新,不然不更新,这种打法将26换成了较小的常数,并且不需要memset,真是出家旅行必备骗分之良器

 #include <bits/stdc++.h>

 typedef long long LL;

 inline int rd() {
int a = , b = ; char c = getchar();
while (!isdigit(c)) a = c == '-' ? : , c = getchar();
while (isdigit(c)) b = b * + c - '', c = getchar();
return a ? b : -b;
} const int N = + ; int n, m; char str[N]; int same[N * ]; #define ls(p) p << 1
#define rs(p) p << 1 | 1 void pushup(int p) {
if (same[ls(p)] == same[rs(p)])
same[p] = same[ls(p)];
else same[p] = ;
} void pushdown(int p) {
if (same[p])
same[ls(p)] = same[rs(p)] = same[p];
} void build(int p, int L, int R) {
if (L == R) return (void)(same[p] = str[L]);
int mid = (L + R) >> ;
build(ls(p), L, mid);
build(rs(p), mid + , R);
pushup(p);
} void change(int p, int l, int r, int v, int L, int R) {
if (l <= L && r >= R) return (void)(same[p] = v);
pushdown(p); int mid = (L + R) >> ;
if (l <= mid) change(ls(p), l, r, v, L, mid);
if (r > mid) change(rs(p), l, r, v, mid + , R);
pushup(p);
} int que[]; void query(int p, int l, int r, int L, int R) {
if (l <= L && r >= R && same[p])
return (void)(que[same[p]] += (R - L + ));
pushdown(p); int mid = (L + R) >> ;
if (l <= mid) query(ls(p), l, r, L, mid);
if (r > mid) query(rs(p), l, r, mid + , R);
} void write(int p, int L, int R) {
if (L == R) return (void)(putchar(same[p]));
pushdown(p); int mid = (L + R) >> ;
write(ls(p), L, mid);
write(rs(p), mid + , R);
} int main() {
scanf("%d%d%s", &n, &m, str + );
build(, , n);
while (m--) {
int l, r, x; scanf("%d%d%d", &l, &r, &x);
for (int i = 'a'; i <= 'z'; ++i) que[i] = ;
query(, l, r, , n);
if (x == ) {
for (int i = 'a', lst = l; i <= 'z'; ++i) if (que[i])
change(, lst, lst + que[i] - , i, , n), lst = lst + que[i];
} else {
for (int i = 'z', lst = l; i >= 'a'; --i) if (que[i])
change(, lst, lst + que[i] - , i, , n), lst = lst + que[i];
}
}
write(, , n);
return ;
}

Orz

 #include<iostream>
#include<cstdio>
#include<cstring>
#define clr(x) memset(x,0,sizeof(x))
using namespace std;
const int MAXN=;
int N,M;
char s[MAXN];
int t[];
char wd[MAXN*];
int cnt[MAXN*][],tg[MAXN];
bool fg[MAXN*];
void bt(int p,int l,int r){
tg[p]=-;
if(l==r){
wd[p]=s[l];
cnt[p][s[l]-'a']=;
return;
}
int mid=(l+r)>>;
bt(p<<,l,mid);
bt(p<<|,mid+,r);
int fgg=;
for(int i=;i<;++i){
cnt[p][i]=cnt[p<<][i]+cnt[p<<|][i];
fgg+=(cnt[p][i]!=);
}
fg[p]=(fgg==);
}
void get(int p,int l,int r,int ll,int rr,int out[]){
if(ll<=l && r<=rr){
for(int i=;i<;++i)
out[i]+=cnt[p][i];
return;
}
if(tg[p]!=-){
int id=tg[p];
int mid=(l+r)>>;
clr(cnt[p<<]);
clr(cnt[p<<|]);
cnt[p<<][id]=mid-l+;
cnt[p<<|][id]=r-(mid+)+;
tg[p<<]=tg[p<<|]=id;
wd[p<<]=wd[p<<|]=id+'a';
fg[p<<]=fg[p<<|]=;
tg[p]=-;
}
int mid=(l+r)>>;
if(ll<=mid)
get(p<<,l,mid,ll,rr,out);
if(rr>mid)
get(p<<|,mid+,r,ll,rr,out);
}
void cover(int p,int l,int r,int ll,int rr,int id){
if(ll<=l && r<=rr){
clr(cnt[p]);
cnt[p][id]=r-l+;
tg[p]=id;
wd[p]=id+'a';
fg[p]=;
return;
}
if(tg[p]!=-){
int id=tg[p];
int mid=(l+r)>>;
clr(cnt[p<<]);
clr(cnt[p<<|]);
cnt[p<<][id]=mid-l+;
cnt[p<<|][id]=r-(mid+)+;
tg[p<<]=tg[p<<|]=id;
wd[p<<]=wd[p<<|]=id+'a';
fg[p<<]=fg[p<<|]=;
tg[p]=-;
}
int mid=(l+r)>>;
if(ll<=mid)
cover(p<<,l,mid,ll,rr,id);
if(rr>mid)
cover(p<<|,mid+,r,ll,rr,id);
int fgg=;
for(int i=;i<;++i){
cnt[p][i]=cnt[p<<][i]+cnt[p<<|][i];
fgg+=(cnt[p]!=);
}
fg[p]=(fgg==);
}
void dfs(int p,int l,int r){
if(l==r){
printf("%c",wd[p]);
return;
}
if(tg[p]!=-){
int id=tg[p];
int mid=(l+r)>>;
clr(cnt[p<<]);
clr(cnt[p<<|]);
cnt[p<<][id]=mid-l+;
cnt[p<<|][id]=r-(mid+)+;
tg[p<<]=tg[p<<|]=id;
wd[p<<]=wd[p<<|]=id+'a';
fg[p<<]=fg[p<<|]=;
tg[p]=-;
}
int mid=(l+r)>>;
dfs(p<<,l,mid);
dfs(p<<|,mid+,r);
}
int main(){
scanf("%d%d",&N,&M);
char c=getchar();
int len=;
while(c<'a' || c>'z')
c=getchar();
while(c<='z' && c>='a'){
s[++len]=c;
c=getchar();
}
bt(,,N);
for(int i=;i<=M;++i){
int l,r,opt;
scanf("%d%d%d",&l,&r,&opt);
clr(t);
get(,,N,l,r,t);
if(opt==){
for(int i=;i>=;--i){
if(t[i])
cover(,,N,l,l+t[i]-,i);
l+=t[i];
}
}
else{
for(int i=;i<;++i){
if(t[i])
cover(,,N,l,l+t[i]-,i);
l+=t[i];
}
}
}
dfs(,,N);
}

正常AC代码

 #include<bits/stdc++.h>
#define MAXN 100005
#define cri const register int
#define pt puts("----------------")
using namespace std;
int now[];
char s[MAXN];
struct Seg_tree{
int t[MAXN*][],f[MAXN*];
#define ls k<<1
#define rs k<<1|1
void change(cri k,cri l,cri r,cri gl,cri gr,cri val)
{
if(l>=gl&&r<=gr)
{
memset(t[k],,sizeof(t[k]));
t[k][val]=r-l+;
f[k]=val;
return ;
}
register int mid=l+r>>;
if(f[k])
{
register int mid=l+r>>;
memset(t[ls],,sizeof(t[ls]));
memset(t[rs],,sizeof(t[rs]));
register int p=f[k];f[k]=;
t[ls][p]=mid-l+;
t[rs][p]=r-mid;
f[ls]=f[rs]=p;
}
if(gl<=mid)change(ls,l,mid,gl,gr,val);
if(gr>mid)change(rs,mid+,r,gl,gr,val);
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
}
void query(cri k,cri l,cri r,cri gl,cri gr)
{
if(l>=gl&&r<=gr)
{
for(register int i=;i<=;i++)now[i]+=t[k][i];
return ;
}
register int mid=l+r>>;
if(f[k])
{
register int mid=l+r>>;
memset(t[ls],,sizeof(t[ls]));
memset(t[rs],,sizeof(t[rs]));
register int p=f[k];f[k]=;
t[ls][p]=mid-l+;
t[rs][p]=r-mid;
f[ls]=f[rs]=p;
}
if(gl<=mid)query(ls,l,mid,gl,gr);
if(gr>mid)query(rs,mid+,r,gl,gr);
return ;
}
void Build(cri k,cri l,cri r)
{
if(l==r)
{
t[k][s[l-]-'a'+]=;
return ;
}
register int mid=l+r>>;
Build(ls,l,mid);
Build(rs,mid+,r);
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
t[k][]=t[ls][]+t[rs][];
}
}T;
inline int Rd()
{
register int x=,f=;register char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-;c=getchar();}
return x*f;
}
int n,m;
int main()
{
scanf("%d%d%s",&n,&m,s);
T.Build(,,n);
while(m--)
{
memset(now,,sizeof(now));
register int l,r,x,t,k;
l=Rd();r=Rd();x=Rd();
k=l;
T.query(,,n,l,r);
if(x)
{
t=;
while(t<=)
{
while(!now[t]&&t<=)++t;
T.change(,,n,k,k+now[t]-,t);
k+=now[t];
now[t]=;
}
}
else
{
t=;
while(t>=)
{
while(!now[t]&&t>=)--t;
T.change(,,n,k,k+now[t]-,t);
k+=now[t];
now[t]=;
}
}
}
for(int i=;i<=n;i++)
{
memset(now,,sizeof(now));
T.query(,,n,i,i);
for(int j=;j<=;j++)
if(now[j])
{
putchar('a'+j-);
break;
}
}
puts("");
return ;
}

我的AC代码。

 #include<cstdio>
char s[],bucx[];int bucr[],buc[],n,m;
main(){
scanf("%d%d%s",&n,&m,s+);bucr[n+]=n+;
for(int i=;i<=n;++i)bucr[i]=i,bucx[i]=s[i];
for(int i=,l,r,x;i<=m;++i){
scanf("%d%d%d",&l,&r,&x);
int j;for(j=l;!bucr[j];--j);
int k=bucr[j]+;if(j!=l)buc[bucx[j]]+=bucr[j]-l+,bucr[j]=l-;else k=j;
while(bucr[k]<=r){
buc[bucx[k]]+=bucr[k]-k+;
int lst=k;k=bucr[k]+;bucr[lst]=;
}
if(k<=r)buc[bucx[k]]+=r-k+,bucr[r+]=bucr[k],bucx[r+]=bucx[k],bucr[k]=;
if(x)for(char ch='a';ch<='z';++ch)if(buc[ch])bucr[l]=l+buc[ch]-,bucx[l]=ch,l=bucr[l]+,buc[ch]=;
if(!x)for(char ch='z';ch>='a';--ch)if(buc[ch])bucr[l]=l+buc[ch]-,bucx[l]=ch,l=bucr[l]+,buc[ch]=;
}
for(int i=;i<=n;i=bucr[i]+)for(int j=i;j<=bucr[i];++j)putchar(bucx[i]);
}

300ms做法

(Orz wd暴力QJ神仙打法)

T2:matrix

dp状态设的很神 f[i][j]表示前i列满足j个有区间且满足题意的方案数

先设ls[i]表示右端点在前i列的左区间的方案数,rs[i]表示左端点在前i列的右区间的方案数

然后就可以转移了,考虑列数增还是不增

不增:f[i+1][j]+=f[i][j]

增:f[i+1][j+1]+=f[i][j]*(rs[i+1]-j)

注意左侧区间我们并没有考虑,实际考虑,供我们选的列有i-j个,前一个状态已经选了ls[i-1]个,新增状态有ls[i]-ls[i-1]个。

用新增状态塞满可选状态并要考虑顺序,同时还有一个合法状态的判定然后就没啦

说起来很简单,但状态真的难想,但也不无道理。

这个题紧紧扣住列,而与具体是哪行无关,所以i,j都与列有关,同时为了方便转移,我们抓住一侧的区间,状态及其转移就显然了。

还是要抓住题目核心性质。

 #include<bits/stdc++.h>
#define MAXN 3005
#define int long long
using namespace std;
const int mod=;
int f[MAXN][MAXN],ls[MAXN],rs[MAXN],l[MAXN],r[MAXN],A[MAXN][MAXN];
signed main()
{
int n,m;
scanf("%lld%lld",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%lld%lld",&l[i],&r[i]);
ls[l[i]]++;rs[r[i]]++;
}
for(int i=;i<=m;i++)ls[i]+=ls[i-],rs[i]+=rs[i-];
A[][]=A[][]=;f[][]=;
for(int i=;i<=m;i++)
{
A[i][]=;A[i][]=i;
for(int j=;j<=i;j++)
A[i][j]=A[i][j-]*(i-j+)%mod;
}
for(int i=;i<=m;i++)
{
for(int j=;j<=min(i,n);j++)
{
if(i-j<ls[i])break;
(f[i][j]*=A[i-j-ls[i-]][ls[i]-ls[i-]])%=mod;
(f[i+][j]+=f[i][j])%=mod;
(f[i+][j+]+=f[i][j]*max(0ll,rs[i+]-j))%=mod;
}
}
cout<<f[m][n]<<endl;
return ;
}

T3:big

这题的难点在于如何转化题意

这个式子实际上就是x的逻辑左移,然后后面就显然了,开一颗Trie树,求最大值即可

 #include<bits/stdc++.h>
#define re register
using namespace std;
const int MAXN=;
int n,maxx,val,sum[MAXN],psum[MAXN],num;
int ch[MAXN*][],tot;
void insert(const int x)
{
re int p=;
for(int i=n-;i>=;i--)
{
re int k=(x>>i)&;
if(!ch[p][k])ch[p][k]=++tot;
p=ch[p][k];
}
return ;
}
void Getans(const int x,int val,int dep)
{
if(!ch[x][]&&!ch[x][])
{
if(val==maxx)num++;
else if(val>maxx)maxx=val,num=;
return ;
}
if(ch[x][]&&ch[x][]){
Getans(ch[x][],val,dep+);
Getans(ch[x][],val,dep+);
return ;
}
if(!ch[x][]||!ch[x][]){
Getans(ch[x][]|ch[x][],val+(<<(n-dep-)),dep+);
}
return ;
}
int main()
{
int m;
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
register int a,k=;scanf("%d",&a);
sum[i]=sum[i-]^a;
if((a>>(n-))&)k=;
(k+=a<<)&=((<<n)-);
psum[i]=psum[i-]^k;
}
for(int i=;i<=m;i++)
insert(psum[i]^(sum[m]^sum[i]));
Getans(,,);
cout<<maxx<<endl<<num<<endl;
return ;
}

总结:

1.分析题目核心性质

2.转化题意

3.卡常

NOIP模拟测试11的更多相关文章

  1. 2019.8.1 NOIP模拟测试11 反思总结

    延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...

  2. [NOIP模拟测试11] 题解

    A.string 和河北的一道省选题很像.考场上写的暴力桶排,正解其实就是优化一下这个思路. 开线段树维护字符串中每个字母出现的次数.对于每条询问,区间查询.区间赋值维护即可. 另外,本题卡常严重,正 ...

  3. NOIP模拟测试11「string&#183;matrix&#183;big」

    打的big出了点小问题,maxx初值我设的0然后少了10分 第二题暴力打炸 第一题剪了一些没用的枝依然40分 总分70 这是一次失败的考试 string 想到和序列那个题很像,但我没做序列,考场回忆学 ...

  4. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  5. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  6. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  7. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  8. NOIP模拟测试17&18

    NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...

  9. NOIP模拟测试1(2017081501)

    好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...

随机推荐

  1. Windows10 1903错误0xc0000135解决方案

    Windows10 1903错误0xc0000135解决方案 === windows10 1903是2019年Mircosoft推出的最新版windows操作系统,但是有很多机器装上之后会存在不支持. ...

  2. Flutter 的setState与FutureBuilder及EasyRefresh示例

    用setState改变状态 class CpwsList extends StatefulWidget { _CpwsListState createState() => _CpwsListSt ...

  3. 【JZOJ5248】花花的聚会

    Description 注意测试数据中道路是 到 的单向道路,与题面恰好相反. Input Output Sample Input 7 7 1 3 1 2 6 7 3 6 3 5 3 4 7 2 3 ...

  4. Python3 解决 ModuleNotFoundError: No module named 'pygal.i18n' 问题

    在获取国别码集通过导入模块pygal报以下问题: from pygal.i18n import COUNTRIES  解决方法: 安装模块 pip3 install pygal_maps_world ...

  5. .NET进阶篇03-Reflection反射、Attribute特性

    知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂 内容目录 一.概述二.反射1.反射使用2.创建对象3.调用方法4.字段属性三.特性四.总结 一.概述 反射其实无处不在,我们用VS进行调试时候, ...

  6. 算法学习之剑指offer(五)

    题目1 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. public class Solution ...

  7. PHP range

    1.函数的作用:生成范围内的数据 2.函数的参数: @param mixed $start @param mixed $end @param mixed $step 3.例子: <?php $n ...

  8. [Tyvj Jan]青蛙跳荷叶

    题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 从前,有一个小青蛙决定去荷叶上练习跳跃.现在有n个荷叶排成一排,小青蛙一开始在最左 ...

  9. [Luogu3420][POI2005]SKA-Piggy Banks

    题目描述 Byteazar the Dragon has NNN piggy banks. Each piggy bank can either be opened with its correspo ...

  10. ‎Cocos2d-x 学习笔记(14.1) Event EventCustom EventListener

    1. Event EventCustom 所有事件类继承了Event. Event中的枚举,定义了事件的类型: enum class Type { TOUCH, //触摸 KEYBOARD, //键盘 ...