P1

题目描述:

  给出一个二分图,选择互不相交的边,使得边覆盖的点权和最大。

solution:

  简单DP,用树状数组维护最大值。

  时间复杂度:$O(n \log n) $

P2

题目描述:

  给出N个或黑或白的元素,每个元素有与A集合和B集合相对应的A,B两个值,将N个元素分成A,B两个集合,使每个集合的前K大中的黑色元素的总和最大。

solution:

  因为每个元素都有两个关键字,而且每个关键字只对对应的集合有用,所以必须对其中一个关键字进行固定。枚举A集合的第K大是哪个元素(i),因为只需要黑色元素总和最大,所以A值比A[i]大的黑色元素都归到A集合,A值比A[i]小的白色元素也归到A集合(防止该元素是B集合的前K大)。然后对黑色元素和剩下的白色元素进行DP,状态f[p][q]表示到前p个元素有q个元素分到了A集合的最大值。

  时间复杂度:$ O(n^3) $

P3

题目描述:

  给定一棵树。在线求路径点序列u -> ... -> v1,连续子序列a1,a2 ... ak满足a1<a2< ... <aj>aj+1 >aj+2 >.....>ak或者a1>a2>... >aj< aj+1<aj+2<.... <ak,1<=j<=k,求最大的 \(k\)。

solution:

  关于树的算法不多,这题LCA就可以了,只是如何实现合并而已,我们对于LCA的每个区间记12个域:

  区间左端:

  - 递增

  - 递减

  - 先增后减

  - 先减后增

  区间右端:

- 递增

- 递减

- 先增后减

- 先减后增

- 区间左端编号

- 区间右端编号

- 区间长度

- 最大值

  至于转移方程嘛……,自己推。

  时间复杂度:$ O(n \log n) $

P4

题目描述:

  给出一个一开始为0的无穷栈,每次从栈顶拿出一个数\(top\),并把栈里剩下的元素最低位变成$ (Y+1) \mod K \((Y为之前的最低位),然后用top与L相比,如果\) top < L \(,那么X减一,否则把\)top+AK\(复制K份放入栈中。当\)X=0$时,结束操作,输出top。

solution:

  这题的数据很大,因此应该是找规律的题目。观察可得,栈里面的数的变化只与出栈次数有关,如果要把栈里的某一个元素出栈,必须经历s次出栈,而( s%K=1).

  令$ L=cAK+d \(,而栈里的数i只可能是\) i=pAK+p,(0\leq p\leq c+1, 0\leq q\leq d) \(因此我们可以寻找循环节。例如\)K=5,L=21,A=2$

  这表格包含了所有可能的数字,从纵向来看,它代表某一个数加AK的值,横向来看,它代表每个数的变化。红色为死亡濒临线。对于第二行(从下向上数)的数来说,必须死13次才能将其出栈,对于第一行来说,必须要死135次才能将其出栈。如果要将第一行的全部出栈,必须死$ 135^2 $次。

再举一个例子:\(K=5,L=26,A=2\)

对于第三行要5次,第二行(52),第三行(53),……

再利用第一个例子研究答案:

30 31 32 33 34 * 31 32 33 34 30 * 22 23 24 *
31 32 33 34 30 * 22 23 24 * 30 31 32 33 34 *
22 23 24 * 30 31 32 33 34 * 31 32 33 34 30 *
23 24 * 30 31 32 33 34 * 31 32 33 34 30 * 22
24 * 30 31 32 33 34 * 31 32 33 34 30 * 22 23 31 32 33 34 30 * 22 23 24 * 30 31 32 33 34 *
22 23 24 * 30 31 32 33 34 * 31 32 33 34 30 *
23 24 * 30 31 32 33 34 * 31 32 33 34 30 * 22
24 * 30 31 32 33 34 * 31 32 33 34 30 * 22 23
30 31 32 33 34 * 31 32 33 34 30 * 22 23 24 * 22 23 24 * 30 31 32 33 34 * 31 32 33 34 30 *
23 24 * 30 31 32 33 34 * 31 32 33 34 30 * 22
24 * 30 31 32 33 34 * 31 32 33 34 30 * 22 23
30 31 32 33 34 * 31 32 33 34 30 * 22 23 24 *
31 32 33 34 30 * 22 23 24 * 30 31 32 33 34 * ……

  规律显得,

  当d<K时,每行有( (d+1)K+(K-d-1) )个元素,每一部分为一行出栈的死亡情况,所以答案的循环节(即整个表格死一次)为( ((d+1)K+(K-d-1))K^c )

  算答案时令( t=(d+1)K+(K-d-1) ),把X拆成( X=a_{0}+\sum_{i=1}{c}a_{i}tK{i-1} ),通过( (\sum_{i=1}^{c}a_{i})%K )算出答案所在行,再利用( a_{0} )确定列。

  当d>=K时,每行有K个元素,所以答案的循环节为( K^(c+2) ),计算答案就想一想好了。

  废话不说(我也解释不清),上代码(和链接)

  wck

  lyl

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <queue>
#include <deque>
#include <map>
#include <vector>
using namespace std;
typedef long long LL;
const LL oo=1e18; int T;
LL X, K, L, A; int main()
{
freopen("avenger.in", "r", stdin);
freopen("avenger.out", "w", stdout);
scanf("%d", &T);
while (T--)
{
scanf("%I64d%I64d%I64d%I64d", &X, &K, &L, &A);
LL AK=A*K;
LL c=L/AK, d=L-AK*c;
LL ans=0;
if (d>=K-1)
{
--X;
for (int i=1; X && i<=c+2; X/=K, ++i)
ans=(ans+X%K)%K;
printf("%I64d\n", (c+1)*AK+ans);
}
else
{
LL t=(d+1)*K+(K-d-1);
--X;
LL a0=X%t;
X/=t;
for (int i=1; X && i<=c; X/=K, ++i)
ans=(ans+X%K)%K;
if (ans<d+1)//the last is in the front最后一行在前
{
if (a0<(d-ans+1)*K)//the last
{
LL tmp=a0%K;
a0/=K;
printf("%I64d\n", (c+1)*AK+(ans+a0+tmp)%K);
}
else//the last but one倒数第二行
{
a0-=(d+1-ans)*K;
if (a0<K-1-d) printf("%I64d\n", c*AK+d+1+a0);
else//the last最后一行
{
a0-=(K-1-d);
printf("%I64d\n", (c+1)*AK+(a0%K+a0/K)%K);
}
}
}
else//the last but one is in the front倒数第二行在前
{
if (a0<(K-d-1)-(ans-d)+1)
printf("%I64d\n", c*AK+a0+ans);
else//the last最后一行
{
a0-=(K-d-1)-(ans-d)+1;
if (a0<K*(d+1))
printf("%I64d\n", (c+1)*AK+(a0/K+a0%K)%K);
else//the last but one倒数第二行
{
a0-=K*(d+1);
printf("%I64d\n", c*AK+d+1+a0);
}
}
}
}
}
return 0;
}

GDKOI2015 Day2的更多相关文章

  1. 【从零开始学BPM,Day2】默认表单开发

    [课程主题]主题:5天,一起从零开始学习BPM[课程形式]1.为期5天的短任务学习2.每天观看一个视频,视频学习时间自由安排. [第二天课程] Step 1 软件下载:H3 BPM10.0全开放免费下 ...

  2. NOIp2016 Day1&Day2 解题报告

    Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...

  3. day2

    三级菜单: ))))))))))] last_levels.pop() ]]]]]]]]:] information = : ch = msvcrt.getch() ][][: : password= ...

  4. java day2一个模拟双色球的代码

    package day2; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt ...

  5. Python基础-day2

    1.Python模块python 中导入模块使用import语法格式:import module_name示例1: 导入os模块system('dir')列出当前目录下的所有文件 # _*_ codi ...

  6. 【BZOJ 4517】【SDOI 2016 Round1 Day2 T2】排列计数

    本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题. 考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,, 做完第三题后再回来看 ...

  7. 冲刺阶段 day2

    day2 项目进展 今天本组五位同学聚在一起将项目启动,首先我们对项目进行了规划,分工,明确指出每个人负责哪些项目.由负责第一部分的组员开始编程,在已经搭建好的窗体内,对系部设置进行了编写,本校共六个 ...

  8. python_way ,day2 字符串,列表,字典,时间模块

    python_way ,day2 字符串,列表,字典,自学时间模块 1.input: 2.0 3.0 区别 2.0中 如果要要用户交互输入字符串: name=raw_input() 如果 name=i ...

  9. 二模 (8) day2

    第一题: 题目描述: 有 n 个炸弹,有些炸弹牵了一根单向引线(也就是说引线只有在这一端能被炸弹点燃),只要引爆了这个炸弹,用引线连接的下一个炸弹也会爆炸.每个炸弹还有个得分,当这个炸弹被引爆后就能得 ...

随机推荐

  1. 四轴飞行器1.2.1 RT-Thread 环境搭建

    买的飞控板到了,开始写下位机的程序了,本来打算用UCOS的,因为以前用过,比较熟悉,可以很快上手,不过板子的卖家推荐了RT-Thread,以前虽然有接触过,但是没用过,于是去官网看了下,感觉还不错.其 ...

  2. winform 拖动无边框窗体(调用Windows API)

    第一步:将窗体的FormBoderStyle属性设置为None: 第二步:添加一个新类:Win32.cs 代码如下: public class Win32 { [DllImport("use ...

  3. 用gson 解 json

    1.json 简单介绍 轻量级数据存储传输文件,比xml精简. 2.Gson简单介绍 android中解json方式很多,比较常用json-lib  goole-Gson. json-lib要包含的包 ...

  4. Matlab.NET混编技巧之——找出Matlab内置函数

    原文 http://www.cnblogs.com/asxinyu/p/3295309.html Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯 定不难.反之,有时 ...

  5. 短路与&&和按位与&的区别

    条件1&&条件2,短路与&&如果条件1为假则不判断条件2:而按位与&如果条件1为假仍旧判断条件2

  6. 习题3.10 约瑟夫环 josephus问题

    /* assume a header */ /* 双向循环链表 */ struct Node; typedef struct Node * PtrToNode; typedef PtrToNode L ...

  7. snort简介以及在Ubuntu下的安装

    一.简介 Snort是一套开放源代码的网络入侵预防软件与网络入侵检测软件.Snort使用了以侦测签章(signature-based)与通信协议的侦测方法.Snort是一个免费的IDS(入侵监测系统) ...

  8. Introducing Regular Expressions 学习笔记

    Introducing Regular Expressions 读书笔记 工具: regexbuddy:http://download.csdn.net/tag/regexbuddy%E7%A0%B4 ...

  9. setObject与setValue的区别

    在使用NSMutableDictionary的时候经常会使用setValue forKey与setObject forKey,他们经常是可以交互使用的,代码中经常每一种的使用都有.1.先看看setVa ...

  10. Conscription

    Conscription Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total ...