六一儿童节题解QAQ

原创 2016年06月01日 14:57:14

T1:
有n种方块,每种方块有权值和个数。
每次寻找区间[l,r]的权值范围在[a,b]的方块中,选k个搭积木。
问每个积木的最大的权值最小是多少。
n,m<=30000
题解:
问最大的权值最小不就是……
排个序之后的第k个,就是最大的最小权值了啊……
然后所以我们考虑这个东西不就是有权值范围限制的第k大吗……
这不是裸的可持久化线段树吗……
随便搞搞就好了。

#include <algorithm>
#include <cstdio>
#include <cstring>
#define Rep(i,n) for(int i = 1;i <= n;i ++)
#define u t[x]
#define o t[y]
#define mid (l + r >> 1)
#define lson u.lc,l,mid
#define rson u.rc,mid + 1,r
using namespace std;
const int N = 30005;
const int NN = ((1 << 30) - 5);
int tot = 0,n,m,ql,qr,qwl,qwr,K,rt[N];
struct Seg{int lc,rc,cnt;}t[N << 5];
void Ins(int &x,int l,int r,int val,int ct,int y)
{
    if(!x)x = ++ tot;
    u.cnt = o.cnt;
    u.cnt += ct;
    if(l == r)return;
    if(val <= mid)Ins(lson,val,ct,o.lc),u.rc = o.rc;
    else Ins(rson,val,ct,o.rc),u.lc = o.lc;
}
int Qry_val(int x,int l,int r,int y)
{
    if(l >= qwl && r <= qwr)
        return u.cnt - o.cnt;
    int a1 = 0,a2 = 0;
    if(qwl <= mid)a1 = Qry_val(lson,o.lc);
    if(mid < qwr)a2 = Qry_val(rson,o.rc);
    return a1 + a2;
}
int Qry(int x,int l,int r,int y)
{
    if(l == r)return l;
    int Now = t[u.lc].cnt - t[o.lc].cnt;
    if(Now < K)return K -= Now,Qry(rson,o.rc);
    else return Qry(lson,o.lc);
}
int main ()
{
    freopen("building.in","r",stdin);
    freopen("building.out","w",stdout);
    scanf("%d",&n);
    Rep(i,n)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        Ins(rt[i],1,NN,a,b,rt[i - 1]);
    }
    scanf("%d",&m);
    Rep(i,m)
    {
        scanf("%d%d%d%d%d",&ql,&qr,&qwl,&qwr,&K);
        int cpt = Qry_val(rt[qr],1,NN,rt[ql - 1]); 
        if(cpt < K){puts("-1");continue;}
        swap(qwl,qwr),qwl = 1,qwr --;
        int cpp;
        if(qwl > qwr)cpp = 0;
        else cpp = Qry_val(rt[qr],1,NN,rt[ql - 1]); 
        K = cpp + K;
        printf("%d\n",Qry(rt[qr],1,NN,rt[ql - 1]));
    }
    return 0;
}

T2:
给一个点带权有向图,每个点有花费,你需要选择一些点,使得拆掉这些点之后,不能从入度为0的点到达出度为0的点。
求最小的花费总和。
n<=1000,m<=6000
题解:
炸了。
T3:
给一个数列,数列相当于一条彩带,可以选择把数列的某个位置x切开,拼接a[x,n]和a[1,x - 1]。
求拼接之后的最小字典序的数列。
例子:4 3 2 1
答案:1 4 3 2
题解:
最小表示法。
我们用两个指针去扫,假设:
s[i - > i + k - 1] == s[j - > j + k - 1]
s[i + k] > s[j + k]
则:
考虑i有没有可能是最终答案:
显然不可能对吧,因为从j开始就比i优。
那么i + 1可不可能是最终答案呢?
显然j + 1比i + 1还要优。
所以s[i + k + 1]之后的才有可能作为最终答案。
我们就直接把i跳到i + k + 1的部分就成了。
总的复杂度显然是O(n)的。

#include <cstdio>
#include <cstring>
#define Rep(i,n) for(int i = 1;i <= n;i ++)
using namespace std;
int s[300005],n;
int Get(int *a)
{
    int i = 1,j = 2,k = 0,len = n;
    while(i <= n && j <= n && k <= n)
    {
        if(k == n)return i;
        if(i == j)j ++;
        int ni = i + k,nj = j + k;
        if(ni > len)ni -= len;
        if(nj > len)nj -= len;
        if(a[ni] > a[nj])i += k + 1,k = 0;
        else if(a[nj] > a[ni])j += k + 1,k = 0;
        else k ++;
    }
    return i;
}
int main ()
{
    freopen("work.in","r",stdin);
    freopen("work.out","w",stdout);
    scanf("%d",&n);
    Rep(i,n)scanf("%d",&s[i]);
    int pos = Get(s);
    for(int i = pos;i <= n;i ++)
        printf("%d ",s[i]);
    for(int i = 1;i < pos;i ++)
        printf("%d ",s[i]);
    puts("");
    return 0;
}

T3死因:后缀数组写不出来,水不过。

版权声明:呐,转载请交稿费QAQ(*随意转载啦)

递归和迭代算法深入分析(入门篇)

递归和迭代算法深入分析              递归的定义:程序调用自身的编程技巧称为递归( recursion)。   迭代的定义:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每...
  • liujian20150808
  • liujian20150808
  • 2015年11月08日 11:46
  • 1083

六一儿童节,

天馈系统包括天线和馈线,这两“线”台中那边已经寄过来了,今天开始测试一下两台AP能不能联起来,再决定是不是和长隆那边联线,台中那人说全向天线和定向天线是可以混合使用的,也就是目前我要用全向天线和定向天...
  • u014461454
  • u014461454
  • 2014年03月31日 17:24
  • 459

2017ccpc哈尔滨站题解合集

2017ccpc哈尔滨站题解合集
  • axuhongbo
  • axuhongbo
  • 2017年11月15日 21:14
  • 372

[洛谷模板大赛]题解 模板整理QAQ

题目地址:NOIP RP++题目描述不用说,都是交模板就能AC的,昨晚就A了4个题因为时间不太够了…… 最近也想整理模板,看到这么个模板大赛自然是把持不住辣~ 除了T2平衡树不会做之外其他的都可以...
  • Loi_Seavot
  • Loi_Seavot
  • 2015年11月05日 09:18
  • 783

ATP的CTSC2017现形记

thusc和pkusc接连撞掉SDOIR2啊,真过分。。差评×
  • FromATP
  • FromATP
  • 2017年05月10日 21:59
  • 1253

LeetCode-分类题解

https://github.com/soulmachine/leetcode/raw/master/C%2B%2B/leetcode-cpp.pdf 原作者:戴方勤(soulmachine@gma...
  • skp127
  • skp127
  • 2016年07月03日 14:53
  • 1010

剑指offer-46.孩子们的游戏(圆圈中最后剩下的数)

题目:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一...
  • I_love_blog
  • I_love_blog
  • 2017年05月06日 20:15
  • 178

每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m

剑指offer:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他...
  • u013686654
  • u013686654
  • 2017年08月01日 21:47
  • 272

面试题45:圆圈中最后剩下的数字

题目:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一...
  • hyp1977
  • hyp1977
  • 2016年07月20日 21:07
  • 179

NOIP 2017题解(更新ing)

D1T1:小凯的疑惑 题目:求一个最大的正整数c,使得ax+by=c(其中a,b为互质的两个正整数)没有非负正整数解。 正解:(想要直接数学推导的就去找数竞大佬吧。。。下面说说考试时怎么办——“一...
  • KGV093
  • KGV093
  • 2017年12月07日 23:20
  • 59
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:六一儿童节题解QAQ
举报原因:
原因补充:

(最多只允许输入30个字)