题解:

很多模板题

第一次写莫队还比较顺利

除了把排序的cmp写错。。(还第一次遇到)

这题分块也可以

先预处理出g[i][j]代表前i个块,颜色为j的有多少种

f[i][j]表示i-j的块能构成多少对

处理的方法就是f[i][j-1]+j块内和j与j之前

算答案的时候即整块+两个单独块内部和两个单独块与整块之间

因为分块有几个地方都是$n\sqrt{n}$的 所以分块的常数比莫队要来的大

#include <bits/stdc++.h>

using namespace std;

#define rint register int

#define IL inline

#define rep(i,h,t) for (int i=h;i<=t;i++)

#define dep(i,t,h) for (int i=t;i>=h;i--)

#define ll long long 

#define me(x) memset(x,0,sizeof(x))

namespace IO

{

    char ss[<<],*A=ss,*B=ss;

    IL char gc()

    {

        return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;

    }

    template<class T>void read(T &x)

    {

        rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);

        while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;

    }

    char sr[<<],z[]; int Z,C=-;

    template<class T>void wer(T x)

    {

        if (x<) sr[++C]='-',x=-x;

        while (z[++Z]=x%+,x/=);

        while (sr[++C]=z[Z],--Z);

    }

    IL void wer1()

    {

        sr[++C]=' ';

    }

    IL void wer2()

    {

        sr[++C]='\n';

    }

    template<class T>IL void maxa(T &x,T y) {if (x<y) x=y;}

    template<class T>IL void mina(T &x,T y) {if (x>y) x=y;}

    template<class T>IL T MAX(T x,T y){return x>y?x:y;}

    template<class T>IL T MIN(T x,T y){return x<y?x:y;}

};

using namespace IO;

const int N=1e5+;

const int M=;

int n,m,k,block,q;

int a[N],pos[N],b[N],now1[N],now2[N];

ll ans2[N];

struct re{

    int a,b,c;

}p[N];

ll ans=;

bool cmp(re x,re y)

{

    return pos[x.a]<pos[y.a]||(pos[x.a]==pos[y.a]&&x.b<y.b);

}

IL void insert1(int x,int y)

{

    if (y==)

    {

      now2[b[x]]+=y;

      now1[b[x-]]+=y;

    }

    ans+=now2[b[x-]^k]*y;

    if (y==-)

    {

      now2[b[x]]+=y;

      now1[b[x-]]+=y;

    }

}

IL void insert2(int x,int y)

{

    if (y==)

    {

        now2[b[x]]+=y;

        now1[b[x-]]+=y;

    }

    ans+=now1[b[x]^k]*y;

    if (y==-)

    {

        now2[b[x]]+=y;

        now1[b[x-]]+=y;

    }

}

int main()

{

    freopen("1.in","r",stdin);

    freopen("1.out","w",stdout);

    read(n); read(q); read(k);

    rep(i,,n) read(a[i]);

    block=sqrt(n);

    m=(n-)/block+;

    rep(i,,n) pos[i]=(i-)/block+;

    rep(i,,q)

      read(p[i].a),read(p[i].b),p[i].c=i;

    sort(p+,p+q+,cmp);

    rep(i,,n) b[i]=b[i-]^a[i];

    rep(i,p[].a,p[].b)

    {

        now1[b[i-]]++;

        ans+=now1[b[i]^k];

        now2[b[i]]++;

    }

    ans2[p[].c]=ans;

    rep(i,,q)

    {

        if (p[i].a>p[i-].a)

          rep(j,p[i-].a,p[i].a-)

            insert1(j,-);

        else dep(j,p[i-].a-,p[i].a) insert1(j,);

        if (p[i].b>p[i-].b)

          rep(j,p[i-].b+,p[i].b) insert2(j,);

        else dep(j,p[i-].b,p[i].b+) insert2(j,-);

        ans2[p[i].c]=ans;

    }

    rep(i,,q) wer(ans2[i]),wer2();

    fwrite(sr,,C+,stdout);

    return ;

}

题目上面画个矩形下面用点真的是傻逼

要是是矩形的画就比较麻烦 要判断4条边是否与那个线相交

可以写特殊处理 当然也可以直接用计算几何里的线段与线段相交判定了

要是直线的画直接叉积就可以了

预处理一下再状压dp

不太卡常

#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for (int i=h;i<=t;i++)
#define dep(i,t,h) for (int i=t;i>=h;i--)
#define ll long long
#define me(x) memset(x,0,sizeof(x))
namespace IO
{
char ss[<<],*A=ss,*B=ss;
IL char gc()
{
return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
}
template<class T>void read(T &x)
{
rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
}
char sr[<<],z[]; int Z,C=-;
template<class T>void wer(T x)
{
if (x<) sr[++C]='-',x=-x;
while (z[++Z]=x%+,x/=);
while (sr[++C]=z[Z],--Z);
}
IL void wer1()
{
sr[++C]=' ';
}
IL void wer2()
{
sr[++C]='\n';
}
template<class T>IL void maxa(T &x,T y) {if (x<y) x=y;}
template<class T>IL void mina(T &x,T y) {if (x>y) x=y;}
template<class T>IL T MAX(T x,T y){return x>y?x:y;}
template<class T>IL T MIN(T x,T y){return x<y?x:y;}
};
using namespace IO;
double ee=1.0000000000000000;
const double eps=1e-;
const int N=(<<)+;
const int mo=;
int n;
int f[][N];
int p[][];
struct re{
int x,y;
}a[];
IL void js(register int &x,register int y)
{
x=(x+y>mo)?x+y-mo:x+y;
}
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
read(n);
rep(i,,n)
{
read(a[i].x); read(a[i].y);
}
rep(i,,n)
rep(j,,n)
if (i!=j)
rep(k,,n)
if (k!=i&&k!=j)
{
/*if (a[i].x==a[j].x)
{
if (a[k].x==a[i].x&&a[k].y>=MIN(a[i].y,a[j].y)&&a[k].y<=MAX(a[i].y,a[j].y))
p[i][j]|=(1<<(k-1));
}
else
{
double now=ee*(a[j].y-a[i].y)/(a[j].x-a[i].x)*(a[k].x-a[i].x)+a[i].y;
if (a[k].x<=MAX(a[i].x,a[j].x)&&a[k].x>=MIN(a[i].x,a[j].x)&&now+eps>a[k].y&&now<a[k].y+1)
p[i][j]|=(1<<(k-1));
}*/
if (a[k].x<=MAX(a[i].x,a[j].x)&&a[k].x>=MIN(a[i].x,a[j].x)&&a[k].y<=MAX(a[i].y,a[j].y)&&a[k].y>=MIN(a[i].y,a[j].y)
&&(a[k].x-a[i].x)*(a[j].y-a[k].y)-(a[j].x-a[k].x)*(a[k].y-a[i].y)==)
p[i][j]|=<<(k-);
}
rep(i,,n) f[i][<<(i-)]=;
int l=(<<n)-;
int ans=;
rep(i,,l)
rep(j,,n)
if (f[j][i])
{
rep(k,,n)
if (((i>>(k-))&)==&&(p[j][k]&(~i))==) js(f[k][i|(<<(k-))],f[j][i]);
if (__builtin_popcount(i)>=) js(ans,f[j][i]);
}
wer(ans);
fwrite(sr,,C+,stdout);
return ;
}

[CQOI2018]交错序列

这可能是六题里唯一一题不是模板的题

首先最暴力的做法

就是$f[i][j][0/1]$表示前i个数有j个1且当前是0/1的方案数

复杂度$O(n^2)$

发现这个dp方程比较简单,考虑直接用数学方法求解

先放1,然后再插空 答案就是$C(n-k+1,k)*k^a*(n-k)^b$

这个东西$nlogn$ 因为模数比较小 所以组合数需要用lucas定理计算

据游记所说这种做法好像并不能卡过?

晚上写

然后注意到这题a,b比较小

考虑去展开$k^a*(n-k)^b$

会发现我们只需要维护$k^{1~(a+b)}$就可以了

然后$(k+1)^x$这个东西又可以用关于k的次方递推

于是就可以上矩阵快速幂了

时间复杂度$(a+b)^3*logn$

cqoi2018的更多相关文章

  1. BZOJ_5296_[Cqoi2018]破解D-H协议_BSGS

    BZOJ_5296_[Cqoi2018]破解D-H协议_BSGS Description Diffie-Hellman密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码 ...

  2. bzoj 5301: [Cqoi2018]异或序列 (莫队算法)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5301 题面; 5301: [Cqoi2018]异或序列 Time Limit: 10 Sec ...

  3. 「luogu4462」[CQOI2018] 异或序列

    「luogu4462」[CQOI2018]异或序列 一句话题意 输入 \(n\) 个数,给定\(k\),共 \(m\) 组询问,输出第 \(i\) 组询问 \(l_i\) \(r_i\) 中有多少个连 ...

  4. [HEOI2015]小Z的房间 && [CQOI2018]社交网络

    今天看了一下矩阵树定理,然后学了一下\(O(n ^ 3)\)的方法求行列式. 哦对了,所有的证明我都没看-- 这位大佬讲的好呀: [学习笔记]高斯消元.行列式.Matrix-Tree 矩阵树定理 关于 ...

  5. 【BZOJ5300】[CQOI2018]九连环 (高精度,FFT)

    [BZOJ5300][CQOI2018]九连环 (高精度,FFT) 题面 BZOJ 洛谷 题解 去这里看吧,多么好 #include<iostream> #include<cstdi ...

  6. 【BZOJ5298】[CQOI2018]交错序列(动态规划,矩阵快速幂)

    [BZOJ5298][CQOI2018]交错序列(动态规划,矩阵快速幂) 题面 BZOJ 洛谷 题解 考虑由\(x\)个\(1\)和\(y\)个\(0\)组成的合法串的个数. 显然就是把\(1\)当做 ...

  7. CQOI2018简要题解

    CQOI2018简要题解 D1T1 破解 D-H 协议 题意 Diffie-Hellman 密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码)的情况下,通过不安全的信 ...

  8. [CQOI2018]交错序列 (矩阵快速幂,数论)

    [CQOI2018]交错序列 \(solution:\) 这一题出得真的很好,将原本一道矩阵快速幂硬生生加入组合数的标签,还那么没有违和感,那么让人看不出来.所以做这道题必须先知道(矩阵快速幂及如何构 ...

  9. LG4455 【[CQOI2018]社交网络】

    分析 这题我们先转化为图论模型,发现求的其实就是有向图中以1为根的生成树数量.而关于这一问题存在O(3^n * n^2)的算法,一看数据n=250,发现不行.于是需要更高效的算法--Matrix-Tr ...

随机推荐

  1. 2017.12.10《“剑锋OI”普及组多校联盟系列赛(14)#Sooke#Kornal 的课余时间 》分析报告

    报告内容如下 - - [导语] ------ 太晚了,时间也紧,一切尽量从简吧 PS:本文题目来自剑锋OI 所以废话也不多说,进入正题吧,代码直接跟在题目后边儿,主要分析在代码前,次要的就写在代码后面 ...

  2. 使用lld自动发现监控多实例redis

    zabbix 可以通过常见的手段监控到各种服务,通过编写脚本来获取返回值并将获取到的值通过图形来展现出来,包括(系统.服务.业务)层面.可是有些时候在一些不固定的场合监控一些不固定的服务就比较麻烦.例 ...

  3. git pull/fectch

    git remote: show all remote repositories git push -u <X1> <>: set x1 as the default repo ...

  4. HBase的replication原理及部署

    一.hbase replication原理 hbase 的复制方式是 master-push 方式,即主集群推的方式,主要是因为每个rs都有自己的WAL. 一个master集群可以复制给多个从集群,复 ...

  5. Android启动模式之singleinstance的坑

    前言 在实际应用中,使用singleinstance启动模式时,会遇到一些奇奇怪怪的问题.Android有四种启动模式,分别是standard,singleTop,singleTask,singleI ...

  6. Codeforces 1132G Greedy Subsequences [线段树]

    洛谷 Codeforces 看到题解那么少就来发一篇吧-- 思路 看完题目一脸懵逼,感觉无从下手. 莫名其妙地想到笛卡尔树,但笛卡尔树好像并没有太大作用. 考虑把笛卡尔树改一下:每个点的父亲设为它的右 ...

  7. 洛谷P4606 [SDOI2018]战略游戏 [广义圆方树]

    传送门 思路 先考虑两点如何使他们不连通. 显然路径上所有的割点都满足条件. 多个点呢?也是这样的. 于是可以想到圆方树.一个点集的答案就是它的虚树里圆点个数减去点集大小. 可以把点按dfs序排序,然 ...

  8. grep匹配某个次出现的次数

    cat file | grep  -c 'xxx'  统计xxx在file中出现的行数 cat file | grep  -o 'xxx'  统计xxx在file中出现的次数

  9. C#标准体重判断

  10. 机器学习之线性回归---logistic回归---softmax回归

    在本节中,我们介绍Softmax回归模型,该模型是logistic回归模型在多分类问题上的推广,在多分类问题中,类标签 可以取两个以上的值. Softmax回归模型对于诸如MNIST手写数字分类等问题 ...