1. 程式人生 > >【HHHOJ】NOIP2018 模擬賽(二十四) 解題報告

【HHHOJ】NOIP2018 模擬賽(二十四) 解題報告

得分: 100+60+100100+60+100(挺好的,漲了一波RatingRating

排名: Rank1Rank\ 1

RatingRating+115+115

T1T1:【HHHOJ13】金(點此看題面

將這道題的題意一轉化,其實就是給你兩個數,讓你判斷這兩個是否互質

xxyy互質和gcd(x,y)=1gcd(x,y)=1是一個意思。

所以只要求出gcd(x,y)gcd(x,y)即可。

為了避免使用高精,我們可以寫PythonPython,程式碼如下:

def gcd(n,m):#定義函式,以供遞迴呼叫
if m==0: return n#如果m=0,返回n else: return gcd(m,n%m)#否則返回gcd(m,n%m) T=(int)(input())#讀入資料組數 while T: st=input().split()#在一行裡讀入兩個數 n=(int)(st[0])#用n儲存第一個數 m=(int)(st[1])#用m儲存第二個數 if gcd(n,m)==1: print("Yes")#如果gcd(n,m)=1,輸出Yes else: print("No")
#否則輸出No T-=1#將資料組數減1

T2T2:【HHHOJ14】斯諾(點此看題面

這題剛看完真的是非常懵,因此寫了個大力分類討論,交上去得了6060分。

但其實看完題解後這題還是很水的。

首先,有一個基本事實:革命的區間數量==總區間數量n(n+1)2\frac {n(n+1)}2-不革命的區間數量

而不革命的區間其實只有三種:00的數量大於區間一半、11的數量大於區間一半、22的數量大於區間一半。

我們可以考慮把大於區間一半的數看成11,小於一半的數看成1-1,那麼我們要求的就是值>0>0的區間個數。

如果用s

umisum_i表示x=1iax\sum_{x=1}^ia_x,則就是要求有多少個jij\le i滿足sumi>sumjsum_i>sum_j

於是我們可以開一個數組totitot_i表示滿足sumx=isum_x=ixx的數量

那麼我們要求的就是i=nsumx1toti\sum_{i=-n}^{sum_x-1}tot_i,這顯然可以用字首和+樹狀陣列維護(雖然O(nlogn)O(nlogn),但是由於樹狀陣列常數巨小,所以某些奆老依然能卡過)。

不過,其實我們完全沒必要這麼麻煩。

可以發現,當你查詢了totitot_i之後,只會查詢與其相鄰的一位(toti1tot_{i-1}toti+1tot_{i+1}),因此直接O(1)O(1)更新即可。

這樣一來,總複雜度就是O(n)O(n)的。

#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define uint unsigned int
#define LL long long
#define ull unsigned long long
#define swap(x,y) (x^=y,y^=x,x^=y)
#define abs(x) ((x)<0?-(x):(x))
#define INF 1e9
#define Inc(x,y) ((x+=(y))>=MOD&&(x-=MOD))
#define ten(x) (((x)<<3)+((x)<<1))
#define N 5000000
using namespace std;
int n,a[N+5];LL ans;
class FIO
{
	private:
		#define Fsize 100000
		#define tc() (FinNow==FinEnd&&(FinEnd=(FinNow=Fin)+fread(Fin,1,Fsize,stdin),FinNow==FinEnd)?EOF:*FinNow++)
		#define pc(ch) (FoutSize<Fsize?Fout[FoutSize++]=ch:(fwrite(Fout,1,FoutSize,stdout),Fout[(FoutSize=0)++]=ch))
		int f,FoutSize,OutputTop;char ch,Fin[Fsize],*FinNow,*FinEnd,Fout[Fsize],OutputStack[Fsize];
	public:
		FIO() {FinNow=FinEnd=Fin;}
		inline void read(int &x) {x=0,f=1;while(!isdigit(ch=tc())) f=ch^'-'?1:-1;while(x=ten(x)+(ch&15),isdigit(ch=tc()));x*=f;}
		inline void read_digit(int &x) {while(!isdigit(x=tc()));x&=15;}
		inline void write(LL x) {if(!x) return (void)pc('0');if(x<0) pc('-'),x=-x;while(x) OutputStack[++OutputTop]=x%10+48,x/=10;while(OutputTop) pc(OutputStack[OutputTop]),--OutputTop;}
		inline void end() {fwrite(Fout,1,FoutSize,stdout);}
}F;
class Class_Solver//求解
{
	private:
		LL tot[(N<<1)+5];
	public:
		inline LL Operate(int v)//操作
		{
			register LL sum=1;memset(tot,0,sizeof(tot));//注意清空
			for(register int i=tot[N]=1,x=N;i<=n;++i)
			{
				if(a[i]^v) sum-=tot[x]+tot[x-1],++tot[--x],ans-=sum,sum+=tot[x];//對於a[i]不等於v的情況,將x減1
				else ++tot[++x],ans-=sum,sum+=tot[x];//對於a[i]等於v的情況,將x加1
			}
		} 
}Solver;
int main()
{
    register int i;
    for(F.read(n),i=1,ans=1LL*n*(n+1)>>1;i<=n;++i) F.read_digit(a[i]);//讀入,初始化ans為n(n+1)/2
    Solver.Operate(0),Solver.Operate(1),Solver.Operate(2);//列舉大於區間一半的數的個數
    return F.write(ans),F.end(),0;
}

T3T3:【HHHOJ15】赤(點此看題面

做到這題真的感覺人品爆表了。

幾周前學**WQSWQS二分**時上網搜例題,第一個搜到的就是這題,沒想到居然還會在模擬賽中出現!

LinkLink

WQSWQS二分 詳見部落格 WQS二分學習筆記

#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define uint unsigned int
#define LL long long
#define ull unsigned long long
#define swap(x,y) (x^=y,y^=x,x^=y)
#define abs(x) ((x)<0?-(x):(x))
#define INF 1e9
#define Inc(x,y) ((x+=(y))>=MOD&&(x-=MOD))
#define ten(x) (((x)<<3)+((x)<<1))
#define N 100000
#define eps 1e-12
using namespace std;
int n,A,B;double s1[N+5],s2[N+5];
class Class_WQS//WQS二分套WQS二分
{
    private:
        double C1,C2,f[N+5];int g1[N+5],g2[N+5];//用f[i]表示到第i只貓為止捕捉到的貓總數的最大期望值,並用g1[i]表示此時使用的乾脆面個數,用g2[i]表示此時使用的豆乾個數
        inline void check()//DP轉移
        {
            for(register int i=1;i<=n;++i)
            {
                f[i]=f[i-1],g1[i]=g1[i-1],g2[i]=g2[i-1];//什麼都不使用
                if(f[i-1]+(s1[i]-C1)-f[i]>eps) f[i]=f[i-1]+(s1[i]-C1),g1[i]=g1[i-1]+1,g2[i]=g2[i-1];//使用乾脆面
                if(f[i-1]+(s2[i]-C2)-f[i]>eps) f[i]=f[i-1]+(s2[i]-C2),g1[i]=g1[i-1],g2[i]=g2[i-1]+1;//使用豆乾
                if(f[i-1]+(s1[i]+s2[i]-C1-C2-s1[i]*s2[i])-f[i]>eps) f[i]=f[i-1]+(s1[i]+s2[i]-C1-C2-s1[i]*s2[i]),g1[i]=g1[i-1]+1,g2[i]=g2[i-1]+1;//同時使用乾脆面和豆乾
 			}
 		}
 		inline void GetRes()//第二層二分,二分C2
 		{
            register double l=0.0,r=1.0;
            for(C2=(l+r)/2;r-l>eps;C2=(l+r)/2) 
            {
                if(check(),!(g2[n]^B)) return;//找到符合條件的C2,就可以return了
                g2[n]>B?l=C2:r=C2;//如果選得物品數量偏多,將l更新為C2,否則將r更新為C2
            }
        }
    public:
        inline double GetAns()//第一層二分,二分C1
        {
            register double l=0.0,r=1.0;
            for(C1=(l+r)/2;r-l>eps;C1=
            
           

相關推薦

HHHOJNOIP2018 模擬 解題報告

得分: 100+60+100100+60+100100+60+100(挺好的,漲了一波RatingRatingRating) 排名: Rank1Rank\ 1Rank1 RatingRatingRat

HHHOJNOIP2018 模擬 解題報告

點此進入比賽 得分: \(100+100+20=220\)(\(T1\)打了兩個小時,以至於\(T3\)沒時間打了,無奈交暴力) 排名: \(Rank\ 8\) \(Rating\):\(+19\) \(T1\):【HHHOJ126】求和(點此看題面) 看到這道題,我不由得想到這道題目:【BZO

HHHOJNOIP模擬解題報告

得分: 30+30+70=13030+30+70=13030+30+70=130(弱爆了) 排名: Rank22Rank22Rank22 :Rating:−31:Rating:-31:Rating:−31 T1T1T1:【HHHOJ260】「NOIP模擬賽

Python小白學習之路裝飾器

裝飾器 一、裝飾器的本質 裝飾器的本質就是函式,功能就是為其他函式新增附加功能。 利用裝飾器給其他函式新增附加功能時的原則:         1.不能修改被修飾函式的原始碼        2.不能修改被修飾函式的呼叫方式

演算法紅黑樹叉樹概念與查詢

誒,演算法這個東西,其實沒那麼簡單,但是也沒那麼難。 紅黑樹,其實已經有很多大佬都整理過了,而且文章部落格都寫得超好,我寫這篇文章的目的是:自己整理一次,這些知識才是自己的,否則永遠是別人的~   該系列到現在暫只有3篇文章: 【演算法】紅黑樹(二叉樹)概念與查詢(一):h

2018.12.30NOIP訓練SCOI2018Numazu 的蜜柑次剩餘

題面傳送門 解析: 直接解方程可以得到 a u

D3.js資料視覺化系列教程--力導向圖

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>testD3-22-force.html</title> <script type="t

2016集訓測試小結

時間 第一題 是我 很多 分析 題目 ... 人的 簡單   這場測試賽有必要小結一下.   昨晚 1 點才睡, 今天狀態很差, 先睡了 1 個小時, 然後開始打比賽. 第一題不大會做, 寫了一個代碼後發現是錯的, 第二題看不懂題, 第三題簡單地分析了一下, 發現是一個樹形

S3C2440 塊裝置驅動程式的編寫驅動之用記憶體模擬硬碟

通過上節的塊裝置驅動分析,本節便通過記憶體來模擬塊裝置驅動,方便我們更加熟悉塊裝置驅動框架 參考核心自帶的塊裝置驅動程式: drivers/block/xd.c drivers/block/z2ram.c 1、本節需要的結構體如下: 1.1 gendis

Android開發系列:Notification的功能與使用方法

font _id when ice extends 開發 content androi mark 關於消息的提示有兩種:一種是Toast,一種就是Notification。前者維持的時間比較短暫,後者維持的時間比較長。 並且我們尋常手機的應用比方網易、貼吧等等都有非常多

OGG維護優化腳本-OGG狀態監控系統--後臺腳本

oracle ogg goldengate 這個簡易監控系統具體是由html實現的後臺沒有數據庫,只有從各臺機器收集並上傳過來的html文件通過定時shell腳本整理並分類到各個目錄,然後通過apache被網頁調用具體更新頻率取決於各數據同步服務器的定時任務運行頻率OGG進程狀態整理腳本這個腳本用

聊聊高並發解析java.util.concurrent各個組件 深入理解AQS

sar 成功 通知 ati help write ng- ads 同步 近期總體過了下AQS的結構。也在網上看了一些講AQS的文章,大部分的文章都是泛泛而談。又一次看了下AQS的代碼,把一些新的要點拿出來說一說。 AQS是一個管程。提供了一個主要的同步器的

Python學習筆記StringIO和BytesIO

nbsp from 寫入 enc print == world! byte 初始化 StringIO 很多時候,數據讀寫不一定是文件,也可以在內存中讀寫。 StringIO顧名思義就是在內存中讀寫str。 要把str寫入StringIO,我們需要先創建一個String

笨辦法學Python

love pla ide nor simple open start close sce 習題 24: 更多練習 你離這本書第一部分的結尾已經不遠了,你應該已經具備了足夠的 Python 基礎知識,可以繼續學習一些編程的原理了,但你應該做更多的練習。這個練習的內容比

設計模式---狀態模式

inter man 每一個 con ret ride text src 定義 1、簡介   定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。   狀態模式允許一個對象在其內部狀態改變時改變其行為,這個對象看上去就像改變

C#編程----------修飾符

宋體 public ext str 繼承 應用 man 空間 layout 修飾符 修飾符即應用於類型或成員的關鍵字.修飾符可以指定方法的可見性,如public或private,還可以指定一項的本質,如剛發的vritual或abstract. 可見性的修飾符 修

Python學習—— 前端基礎之Bookstrap

asc script nta 學習 基本 www. red hicon 分享 一、Bootstrap介紹 Bootstrap是Twitter開源的基於HTML、CSS、JavaScript的前端框架。 它是為實現快速開發Web應用程序而設計的一套前端工具包。 它支持響應式布

企業分布式微服務雲SpringCloud SpringBoot mybatis 用spring Restdocs創建API文檔

str () 分布式 ava 顯示 網站發布 shu this 過程 Restdoc,通過單元測試生成api文檔 restdocs是通過單元測試生存snippets文件,然後snippets根據插件生成htm文檔的。 建一個單元測試類: @RunWith(SpringRu

JmeterJmeter-Question之“加密請求參數”

直接 接口 成功 void return beanshell 32位 clas 圖片   日常接口測試碰到參數加密的情況不在少數,當然與之相對的也有解密。直接記錄實例:   排除各家用的不一樣的加密方式,用的最多的還是MD5加密(16,32)。Jmeter3.2版本已經有解

Linux學習筆記管道符和作業控制、shell變量、環境變量配置文件

環境變量配置文件 管道符 一、管道符和作業控制cat 1.txt |wc -l ; cat 1.txt |grep ‘aaa‘將前面命令的結果輸入給後面的命令ctrl z 暫停一個任務、這時候任務隱藏到後臺,通過fg可以重新吊起任務到前臺運行jobs查看後臺的任務bg[id]把任務調到後臺fg[id]